Почему System.Uri не распознает параметр запроса для локального пути к файлу? - PullRequest
8 голосов
/ 06 января 2012

Мне нужно добавить дополнительную информацию о запросе в путь к файлу в качестве параметра запроса для последующего анализа пути во время обработки файлов.Я думаю, что класс 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", но ПОЧЕМУ - как избежать этого?

Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 06 января 2012

Это ошибка, которую Microsoft не исправит: Ошибка 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);  
...  
5 голосов
/ 06 января 2012

Параметры строки запроса недопустимы при запросе локального файла.

Когда вы запрашиваете файл, используя http, файл выполняется и поэтому может прочитать и обработать строку запроса.Когда вы запрашиваете локальный файл, он не выполняется и не может использовать строку запроса.

По какой причине вы добавляете параметры строки запроса в запрос файла?Есть ли другой способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...