How can I force either Uri
or HttpWebRequest
to allow a uri containing both /
and %2f
like the following?
http://localhost:55672/api/exchanges/%2f/MyExchange
I tried this...
WebRequest request =
HttpWebRequest.Create("http://localhost:55672/api/exchanges/%2f/MyExchange");
...and this...
Uri uri = new Uri("http://localhost:55672/api/exchanges/%2f/MyExchange", true);
WebRequest request = HttpWebRequest.Create(uri);
...and this...
UriBuilder builder = new UriBuilder();
builder.Port = 55672;
builder.Path = "api/exchanges/%2f/MyExchange";
WebRequest request = HttpWebRequest.Create(builder.Uri);
However with all of these, request.RequestUri
ends up http://localhost:55672/api/exchanges///MyExchange
and request.GetResponse()
produces a 404 response.
FYI I'm trying to use RabbitMQ's HTTP API and typing the Url in Chrome produces the expected JSON result.
We just had the same problem and discovered that this problem exists if you are targeting the .NET 4.0 framework. It goes away if you target the .NET 4.5 framework. So if that's an option for you, switch your target framework and it should resolve your issue.
I had this exact same problem when communicating with the RabbitMQ management API a while back. I wrote a blog post about it, including a couple of solutions:
http://mikehadlow.blogspot.co.uk/2011/08/how-to-stop-systemuri-un-escaping.html
You can turn the behavior off either with some nasty reflection into the System.Uri code, or by a setting in App.config (or Web.config):
<uri>
<schemeSettings>
<add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
</schemeSettings>
</uri>
Use Server.Encode for part containing the reserved characters.
http://msdn.microsoft.com/en-us/library/ms525738(v=vs.90).aspx
Please use Server.UrlEncode it is required server side or the alternate will be System.Uri.EscapeDataString