2009-05-13 16 views
26

quando eseguo un GET con WebRequest.Create ("http://abc/test.") Ottengo 404 perché secondo il violinista il punto finale viene rimosso da .NET e il server Web ha bisogno del punto. come posso prevenirlo o aggirarlo. qualsiasi soluzione è apprezzata!HttpWebRequest a URL con punto alla fine

+1

http://msdn.microsoft.com/en-us/library/hh367887(v=VS.110).aspx conferma questo è stato fissato in. NET4.5. – EricLaw

risposta

29

Soluzione in scheda soluzione alternativa al rapporto ufficiale bug:

https://connect.microsoft.com/VisualStudio/feedback/details/386695/system-uri-incorrectly-strips-trailing-dots?wa=wsignin1.0#tabs

.. sembra essere valido. Fondamentalmente, eseguire questo codice per reimpostare una bandiera statica in .NET prima di lavorare con System.Uri:

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
if (getSyntax != null && flagsField != null) 
{ 
    foreach (string scheme in new[] { "http", "https" }) 
    { 
     UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme }); 
     if (parser != null) 
     { 
      int flagsValue = (int)flagsField.GetValue(parser); 
      // Clear the CanonicalizeAsFilePath attribute 
      if ((flagsValue & 0x1000000) != 0) 
       flagsField.SetValue(parser, flagsValue & ~0x1000000); 
     } 
    } 
} 

dimostrato:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var surl = "http://x/y./z"; 

      var url = new Uri(surl); 
      Console.WriteLine("Broken: " + url.ToString()); 

      MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
      FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
      if (getSyntax != null && flagsField != null) 
      { 
       foreach (string scheme in new[] { "http", "https" }) 
       { 
        UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme }); 
        if (parser != null) 
        { 
         int flagsValue = (int)flagsField.GetValue(parser); 
         // Clear the CanonicalizeAsFilePath attribute 
         if ((flagsValue & 0x1000000) != 0) 
          flagsField.SetValue(parser, flagsValue & ~0x1000000); 
        } 
       } 
      } 

      url = new Uri(surl); 
      Console.WriteLine("Fixed: " + url.ToString()); 

      Console.WriteLine("Press ENTER to exit ..."); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Trucco intelligente. Funziona molto bene. – harriyott

+0

Grazie mille! ;-) –

+0

non ha funzionato per me. Sto facendo un'applicazione Windows Form. –

-1

si cambia il punto in stringa esadecimale

 string.format("{0:x2}",yoururl);

penso che sia utile per te, perché l'ho usato in Twitter API Oauth formattazione

2

Ha riscritto alcuni di i t a una funzione che dont richiedono di aggiungere eventuali spazi dei nomi

private Uri MyUri(string url) 
    { 
     Uri uri = new Uri(url); 
     System.Reflection.MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
     System.Reflection.FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
     if (getSyntax != null && flagsField != null) 
     { 
      foreach (string scheme in new[] { "http", "https" }) 
      { 
       UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme }); 
       if (parser != null) 
       { 
        int flagsValue = (int)flagsField.GetValue(parser); 
        // Clear the CanonicalizeAsFilePath attribute 
        if ((flagsValue & 0x1000000) != 0) 
         flagsField.SetValue(parser, flagsValue & ~0x1000000); 
       } 
      } 
     } 
     uri = new Uri(url); 
     return uri; 
    } 
Problemi correlati