【问题标题】:Url Encode Forward Slash (/) in .NET.NET 中的 URL 编码正斜杠 (/)
【发布时间】:2012-07-13 17:56:58
【问题描述】:

如何强制Uri 或HttpWebRequest 允许包含/ 和%2f 的uri,如下所示?

http://localhost:55672/api/exchanges/%2f/MyExchange

我试过了……

WebRequest request = 
    HttpWebRequest.Create("http://localhost:55672/api/exchanges/%2f/MyExchange");

...还有这个...

Uri uri = new Uri("http://localhost:55672/api/exchanges/%2f/MyExchange", true);
WebRequest request = HttpWebRequest.Create(uri);

...还有这个...

UriBuilder builder = new UriBuilder();
builder.Port = 55672;
builder.Path = "api/exchanges/%2f/MyExchange";
WebRequest request = HttpWebRequest.Create(builder.Uri);

但是,在所有这些情况下,request.RequestUri 以 http://localhost:55672/api/exchanges///MyExchange 结束,request.GetResponse() 产生 404 响应。

仅供参考,我正在尝试使用 RabbitMQ 的 HTTP API,并在 Chrome 中键入 Url 会产生预期的 JSON 结果。

【问题讨论】:

  • 我也试过HttpWebRequest.Create("http://localhost:55672/api/exchanges/%252f/PrintConnector"); 有趣的是这会产生与上面相同的request.RequestUri,但request.RequestUri.LocalPath 被正确编码为/api/exchanges/%2f/MyConnector
  • FWIW 我已经为 RabbitMQ 管理 API 构建了一个 .NET 客户端,这可能会为您节省一些工作:nuget.org/packages/EasyNetQ.Management.Client

标签: c# url rabbitmq


【解决方案1】:

不久前与 RabbitMQ 管理 API 通信时,我遇到了同样的问题。我写了一篇关于它的博客文章,包括几个解决方案:

http://mikehadlow.blogspot.co.uk/2011/08/how-to-stop-systemuri-un-escaping.html

您可以通过对 System.Uri 代码的一些讨厌的反射或通过 App.config(或 Web.config)中的设置来关闭该行为:

<uri> 
    <schemeSettings>
        <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
    </schemeSettings>
</uri>

【讨论】:

  • 也许我做错了什么,但是这两种解决方案似乎都不适用于 VS 2010 或 2012(使用控制台应用程序)。 Uri uri = new Uri("http://localhost:55672/api/exchanges/%2f/MyExchange"); Console.WriteLine(uri);
  • 我在我的 RabbitMQ.Management.Client 库中完全使用了该方法。看看这里:github.com/mikehadlow/EasyNetQ/tree/master/Source/…
【解决方案2】:

我们刚刚遇到了同样的问题,发现如果您的目标是 .NET 4.0 框架,就会存在这个问题。如果您以 .NET 4.5 框架为目标,它就会消失。因此,如果这是您的选择,请切换您的目标框架,它应该可以解决您的问题。

【讨论】:

  • Targeting .NET 4.5 修复了它,即使没有 uri 配置设置。也许这是 .NET 框架中的一个错误。
  • 似乎又回到了 .NET Core 2.0 中。
【解决方案3】:

请使用 Server.UrlEncode 它是服务器端必需的,否则将是 System.Uri.EscapeDataString

【讨论】:

  • 不幸的是 Uri.EscapeDataString 产生相同的结果:request = HttpWebRequest.Create("http://localhost:55672/api/exchanges/" + Uri.EscapeDataString("/") + "/MyExchange");
【解决方案4】:

对包含保留字符的部分使用 Server.Encode。 http://msdn.microsoft.com/en-us/library/ms525738(v=vs.90).aspx

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2010-10-10
    • 1970-01-01
    • 2015-08-11
    • 2011-11-24
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多