2009-05-13 3 views
26

, когда я делаю GET с помощью WebRequest.Create («http://abc/test.»), Я получаю 404, потому что, по словам скрипача, конечная точка убирается .NET, а веб-серверу нужна точка. как я могу предотвратить это или обойти его. любое обходное решение оценено!HttpWebRequest к URL-адресу с точкой в ​​конце

+1

http://msdn.microsoft.com/en-us/library/hh367887(v=VS.110).aspx подтверждает это было зафиксировано в .NET4. 5. – EricLaw

ответ

0

Это известная проблема, возникшая на форумах Microsoft несколько раз.

Класс Uri неправильно считает, что все URI действуют как файлы дисков Windows, где конечная точка (без расширения файла) не имеет отношения к делу.

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

29

Обход на вкладке обходной на официальном сообщении об ошибке:

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

.. кажется действительным. В принципе, запустить этот код, чтобы сбросить статический флаг в .NET, прежде чем работать с 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); 
     } 
    } 
} 

Демонстрируется:

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

Умный трюк. Работает очень хорошо. – harriyott

+0

Спасибо вам большое! ;-) –

+0

не работал для меня. Я делаю приложение для форм Windows. –

-1

изменить точку в строку для Hex

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

Я думаю, что это полезно для u, потому что я использовал его в twitter API Oauth formatting

2

Переписал некоторые из них t Функция габаритная, что не требуют добавлять любое пространство имен

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