为什么System.Uri不识别本地文件路径的查询参数?

时间:2012-01-06 12:09:18

标签: c# .net uri query-parameters

我需要将一些额外的查询信息添加到文件路径作为查询参数 稍后在文件处理期间解析路径。我虽然 System.Uri 类可以帮助我解决这个问题,但看起来它并没有给出我对本地文件路径的期望。

var fileUri = new Uri("file:///c://a.txt?select=10")
// fileUri.AbsoluteUri = "file:///c://a.txt%3Fselect=10"
// fileUri.Query = ""

var httpUri = new Uri("http://someAddress/a.txt?select=10")
// httpUri.AbsoluteUri = "http://someaddress/a.txt?select=10"
// httpUri.Query = "?select=10"

在“ftp://someAddress/a.txt?select = 10”的情况下 - 查询字符串也为空

我了解 System.Uri 可能会解析“ a.txt?select = 10 ”以更正文件名“ a.txt%3Fselect = 10 < / strong>“,但是为什么 - 如何逃避这个?

提前致谢

2 个答案:

答案 0 :(得分:9)

这是Microsoft无法修复的错误:Bug 594562 正如您所看到的,他们建议将反思作为一种解决方法:

...
Console.WriteLine("Before");
Uri fileUri = new Uri("file://host/path/file?query#fragment");
Console.WriteLine("AbsoluteUri: " + fileUri.AbsoluteUri);
Console.WriteLine("ToString: " + fileUri.ToString());
Console.WriteLine("LocalPath: " + fileUri.LocalPath);
Console.WriteLine("Query: " + fileUri.Query);
Console.WriteLine("Fragment: " + fileUri.Fragment);

Type uriParserType = typeof(UriParser);
FieldInfo fileParserInfo = uriParserType.GetField("FileUri", BindingFlags.Static | BindingFlags.NonPublic);
UriParser fileParser = (UriParser)fileParserInfo.GetValue(null);
FieldInfo fileFlagsInfo = uriParserType.GetField("m_Flags", BindingFlags.NonPublic | BindingFlags.Instance);
int fileFlags = (int)fileFlagsInfo.GetValue(fileParser);
int mayHaveQuery = 0x20;
fileFlags |= mayHaveQuery;
fileFlagsInfo.SetValue(fileParser, fileFlags);

Console.WriteLine();
Console.WriteLine("After");
fileUri = new Uri("file://host/path/file?query#fragment");
Console.WriteLine("AbsoluteUri: " + fileUri.AbsoluteUri);
Console.WriteLine("ToString: " + fileUri.ToString());
Console.WriteLine("LocalPath: " + fileUri.LocalPath);
Console.WriteLine("Query: " + fileUri.Query);
Console.WriteLine("Fragment: " + fileUri.Fragment);  
...  

答案 1 :(得分:5)

请求本地文件时,查询字符串参数无效。

当您使用http请求文件时,文件被执行,因此能够读取和处理查询字符串。当您请求本地文件时,它不会被执行,因此无法使用查询字符串。

将querystring params添加到文件请求的原因是什么?还有另一种方法吗?