2009-05-13 6 views
26

quand je fais un get avec WebRequest.Create ("http://abc/test.") Je reçois 404 parce que selon fiddler le point de queue est dépouillé par .NET et le serveur web a besoin du point. comment puis-je l'empêcher ou contourner ce problème? toute solution de contournement est appréciée!HttpWebRequest à l'URL avec le point à la fin

+1

http://msdn.microsoft.com/en-us/library/hh367887(v=VS.110).aspx confirme cela a été fixé. NET4.5. – EricLaw

Répondre

29

Solution dans l'onglet solution de contournement au rapport officiel de bogue:

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

.. semble être valide. Fondamentalement, exécutez ce code pour réinitialiser un indicateur statique dans .NET avant de travailler avec 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); 
     } 
    } 
} 

démontré:

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

Astuce astucieux. Fonctionne très bien. – harriyott

+0

Merci beaucoup! ;-) –

+0

n'a pas fonctionné pour moi. Je fais une application de formulaires Windows. –

-1

vous modifiez le point dans une chaîne Hex

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

je pense que c'est utile pour vous, parce que je l'ai utilisé dans le format de l'API Oauth twitter

2

Réécrit certains d'i t à une fonction qui ne pas vous obliger à ajouter des espaces de noms

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; 
    } 
Questions connexes