System.Uri查询字符串中的文字&符号

Nat*_*lch 4 .net uri escaping query-string

我正在开发一个客户端应用程序,它使用一个宁静的服务来按名称查找公司.重要的是,我能够在查询中包含文字&符号,因为这个字符在公司名称中非常常见.

但是每当我将%26(URI转义的&符号)传递给System.Uri它时,它会将其转换回常规的&符号!仔细观察,只有两个未转换回来的字符是散列(%23)和百分比(%25).

让我们说我想搜索一家名为"Pierce&Pierce"的公司:

var endPoint = "http://localhost/companies?where=Name eq '{0}'";
var name = "Pierce & Pierce";
Console.WriteLine(new Uri(string.Format(endPoint, name)));
Console.WriteLine(new Uri(string.Format(endPoint, name.Replace("&", "%26"))));
Console.WriteLine(new Uri(string.Format(endPoint, Uri.EscapeUriString(name))));
Console.WriteLine(new Uri(string.Format(endPoint, Uri.EscapeDataString(name))));
Run Code Online (Sandbox Code Playgroud)

以上所有四种组合都返回:

http://localhost/companies?where=Name eq 'Pierce & Pierce'
Run Code Online (Sandbox Code Playgroud)

这会导致服务器端出错,因为&符号被(正确地)解释为查询arg分隔符.我真正需要它返回的是原始字符串:

http://localhost/companies?where=Name eq 'Pierce %26 Pierce'
Run Code Online (Sandbox Code Playgroud)

如何在不System.Uri完全丢弃的情况下解决此问题?我不能在最后一刻用%26替换所有的&符号,因为通常会涉及多个查询参数,我不想破坏它们的分隔符.

注意:这个问题中讨论了类似的问题,但我特别指的是System.Uri.

Guf*_*ffa 10

它不仅是URL中的&符号不正确.有效的URL不能包含空格.

EscapeDataString方法可以正常编码字符串,您应该编码整个值,而不仅仅是名称:

Uri.EscapeDataString("Name eq 'Pierce & Pierce'")
Run Code Online (Sandbox Code Playgroud)

结果:

Name%20eq%20'Pierce%20%26%20Pierce'
Run Code Online (Sandbox Code Playgroud)

Uri使用此字符串创建时,它将是正确的.要查看URL,您可以使用该AbsoluteUri属性.如果您只是将其转换Uri为字符串(调用ToString方法),则URL将不会转义,因此显示不正确.