Hi, when i do a GET with WebRequest.Create("http://abc/test.") i get 404 because according to fiddler the trailing dot gets stripped away by .NET and the web server needs the dot. how can i prevent that or work around it. any workaround is appreciated!
A:
will a trailing slash
WebRequest.Create("http://abc/test./")
or encoding the dot
WebRequest.Create("http://abc/test%2e")
work?
Tracker1
2009-05-14 10:52:26
+1
A:
I have this exact same problem. Adding a trailing slash or encoding the dot with %2e don't work. Did you solve this problem? Or is there anyone with another idea?
MeLLeR
2009-08-03 06:21:08
I narrowed it down to the Uri-class. It removes the dot at the end of every directory. "http://host/foo./bar" -> "http://host/foo/bar"
MeLLeR
2009-08-03 06:39:16
I created a bug-report @ connect.microsoft -> https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=480499
MeLLeR
2009-08-03 16:11:10
A:
This is a known problem that has come up on the Microsoft forums a few times.
The Uri
class incorrectly thinks that all URIs act like Windows disk files where a trailing dot (for no file extension) is not relevant.
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/5206beca-071f-485d-a2bd-657d635239c9/
binarycoder
2009-10-13 00:20:03
+1
A:
Workaround in workaround tab at the official bug report:
.. seems to be valid. Basically, run this code to reset a static flag in .NET before working with 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);
}
}
}
Demonstrated:
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();
}
}
}
stimpy77
2010-02-17 23:44:47