2009-05-13 18 views
26

cuando hago un GET con WebRequest.Create ("http://abc/test.") Obtengo 404 porque según el violinista el punto final es eliminado por .NET y el servidor web necesita el punto. ¿Cómo puedo prevenir eso o evitarlo? cualquier solución es apreciada!HttpWebRequest a URL con punto al final

+1

http://msdn.microsoft.com/en-us/library/hh367887(v=VS.110).aspx confirma esto se fijó en. NET4.5. – EricLaw

Respuesta

29

Solución en la ficha solución en el informe oficial de errores:

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

.. parece ser válida. Básicamente, ejecute este código para restablecer una bandera estática en .NET antes de trabajar 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); 
     } 
    } 
} 

Demostrado:

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

Truco inteligente. Funciona muy bien – harriyott

+0

¡Muchas gracias! ;-) –

+0

no funcionó para mí. Estoy haciendo una aplicación de formularios de Windows. –

-1

cambia el punto en cadena a Hex

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

creo que es útil para ti, porque lo usé en Twitter API Formato Oauth

2

Reescribí algunos de los t a una función que no requieren que usted agregue cualquier espacio de nombres

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; 
    } 
Cuestiones relacionadas