HttpWebRequest a URL con punto al final

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!

Solución alternativa en la pestaña de solución en el informe de error oficial:

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

.. parece ser válido. Básicamente, ejecute este código para restablecer un indicador estático 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(); } } } 

Reescribió algunos de ellos en una función que no requiere que agregue ningún 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; } 

Este es un problema conocido que ha surgido en los foros de Microsoft varias veces.

La clase Uri piensa incorrectamente que todos los URI actúan como archivos de disco de Windows donde un punto final (sin extensión de archivo) no es relevante.

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/5206beca-071f-485d-a2bd-657d635239c9/

cambias el punto en Cadena a Hex

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

Creo que es útil para ti, porque lo usé en el formato de Twitter API Oauth