【问题标题】:Preserve an escaped Uri with HttpClient使用 HttpClient 保留转义的 Uri
【发布时间】:2013-08-06 17:27:04
【问题描述】:

我正在尝试使用 HttpClient 创建具有以下 Uri 的 GET 请求:

http://test.com?action=enterorder&ordersource=acme&resid=urn%3Auuid%3A0c5eea50-9116-414e-8628-14b89849808d 如您所见,resid 参数用 %3A 转义,即“:”字符。

当我在HttpClient请求中使用这个Uri时,url变成:

http://test.com?action=enterorder&ordersource=acme&resid=urn:uuid:0c5eea50-9116-414e-8628-14b89849808d 我收到来自服务器的错误,因为需要 %3A。

在发送请求时,任何人都知道如何保存转义的 Uri?似乎 HttpClient 在发送之前总是在字符串上未转义字符。 这是使用的代码:

Uri uri = new Uri("http://test.com?action=enterorder&ordersource=acme&resid=urn%3Auuid%3A0c5eea50-9116-414e-8628-14b89849808d");
using (HttpClient client = new HttpClient())
{
   var resp = client.GetAsync(uri);
   if (resp.Result.IsSuccessStatusCode)
      {
        var responseContent = resp.Result.Content;
        string content = responseContent.ReadAsStringAsync().Result;
      }
}

【问题讨论】:

  • 您遇到什么错误?服务器没有理由在 url 中处理 "%3A" 而不是 ":"
  • 它是安装在 Apache 服务器上的 Adob​​e Content Server。我知道这是一个奇怪的问题,但预计呼叫会收到 %3A 而不是:
  • 如果使用GetAsync的字符串重载还会出现这种情况吗? client.GetAsync(uri.OriginalString);
  • @keyboardP 仍然无法正常工作 :( 感谢您的提示。
  • 听起来像是服务器中的一个错误,因为“:”和“%3A”应该被相同地处理。

标签: c# escaping uri dotnet-httpclient


【解决方案1】:

您可能希望在 .NET 4.5 中进行测试,因为对转义字符的 Uri 解析进行了一系列改进。

您还可以查看这个 SO 问题:GETting a URL with an url-encoded slash,其中发布了一个 hack,您可以使用它来强制 URI 不被触及。

【讨论】:

  • 该问题的答案之一中提出的 web.config 文件中的设置对我有用,幸运的是不需要黑客。 <uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> </schemeSettings> </uri>
【解决方案2】:

作为一种解决方法,您可以尝试再次编码此 url 部分以规避该问题。 %3A 将变为 %253A

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2021-04-01
    • 2019-11-02
    • 2019-07-11
    相关资源
    最近更新 更多