使用HttpClient保留转义后的Uri

3
我正在尝试使用HttpClient创建一个GET请求,请求的Uri如下:

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”与“:”区分开来。 - Peter Ritchie
1
这是安装在Apache服务器上的Adobe内容服务器。我知道这是一个奇怪的问题,但是调用应该接收%3A而不是:。 - MissRaphie
如果您使用 GetAsync 的字符串重载,它是否仍然会发生?client.GetAsync(uri.OriginalString); - keyboardP
你在哪里使用 uri?你创建了它,但从未使用过。你尝试过 client.GetAsync("http://test.com?action=enterorder&ordersource=acme&resid=urn%3Auuid%3A0c5eea50-9116-414e-8628-14b89849808d" 吗? - Peter Ritchie
1
似乎是服务器中存在的错误,因为“:”和“%3A”应该被处理成相同的字符。 - Peter Ritchie
显示剩余4条评论
2个回答

1
你可能希望在.NET 4.5中进行测试,因为对转义字符的Uri解析进行了大量改进。
你还可以查看这个SO问题: 使用url编码的斜杠GET URL,其中发布了一个技巧,可以强制URI不受影响。

1
在那个问题的答案中提议的 web.config 文件设置对我起作用了,幸运的是不需要使用任何 hack。<uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> </schemeSettings> </uri> - MaQy

0

作为一种解决方法,您可以尝试重新对此URL部分进行编码以规避该问题。%3A将变成%253A。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接