代码之家  ›  专栏  ›  技术社区  ›  Nathan Baulch

system.uri查询字符串中的文本和符号

  •  4
  • Nathan Baulch  · 技术社区  · 14 年前

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

    但是,每当我将%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))));
    

    以上四种组合都返回:

    http://localhost/companies?where=Name eq 'Pierce & Pierce'
    

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

    http://localhost/companies?where=Name eq 'Pierce %26 Pierce'
    

    我怎么能不抛弃这种行为 系统URI 完全? 我不能在最后一刻用%26替换所有的和号,因为通常会涉及多个查询参数,我不想破坏它们的分隔符。

    注: 类似的问题在 this question 但我指的是 系统URI .

    3 回复  |  直到 11 年前
        1
  •  10
  •   Guffa    14 年前

    不仅是和号,URL中的和号也不正确。有效的URL不能包含空格。

    这个 EscapeDataString 方法可以很好地对字符串进行编码,您应该对整个值进行编码,而不仅仅是名称:

    Uri.EscapeDataString("Name eq 'Pierce & Pierce'")
    

    结果:

    Name%20eq%20'Pierce%20%26%20Pierce'
    

    当你创建一个 Uri 使用这个字符串,它将是正确的。要查看URL,可以使用 AbsoluteUri 财产。如果你只是转换 尿嘧啶尿路感染 一个字符串(它调用 ToString 方法)URL将被取消范围,因此看起来不正确。

        2
  •  0
  •   Daniel    14 年前

    我遇到同样的问题。尽管查询字符串是用uri.escapedatastring转义的,并且属性absoluteuri确实正确地转义了它,但是WebBrowser以未转义的格式发送了该uri。

      currentUri = new System.Uri(ServerAgent.urlBase + "/MailRender?uid="
    + Uri.EscapeDataString(uid);
    

    webbrowser.navigate(当前URI);

    加号(“+”)转换为%2b,但服务器仍在url中获取“+”,然后通过httpserveletrequest.getParameter()调用转换为空格(“”)。

        3
  •  0
  •   Daniel    14 年前

    我通过创建一个派生的URI类来解决这个问题。

        class Uri2 : System.Uri
    {
        public Uri2(string url) : base(url)
        {
        }
    
        public override string ToString()
        {
            return AbsoluteUri;
        }
    }
    

    在任何使用system.uri的地方,请使用已替换的uri2。 我不知道这是否是.netcf的错误,webbrowser应该以编码格式发送url,即absoluteuri的值,而不是toString()的值。