Url Encode Forward Slash (/) in .NET

16,406

Solution 1

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.

Solution 2

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>

Solution 3

Please use Server.UrlEncode it is required server side or the alternate will be System.Uri.EscapeDataString

Solution 4

Use Server.Encode for part containing the reserved characters. http://msdn.microsoft.com/en-us/library/ms525738(v=vs.90).aspx

Share:
16,406

Related videos on Youtube

Clay
Author by

Clay

Updated on September 15, 2022

Comments

  • Clay
    Clay over 1 year

    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.

  • Clay
    Clay almost 12 years
    Unfortunately Uri.EscapeDataString produces the same result: request = HttpWebRequest.Create("http://localhost:55672/api/exchanges/‌​" + Uri.EscapeDataString("/") + "/MyExchange");
  • Clay
    Clay over 10 years
    Perhaps I'm doing something wrong, but neither solution seems to work from VS 2010 or 2012 (using console application). Uri uri = new Uri("http://localhost:55672/api/exchanges/%2f/MyExchange"); Console.WriteLine(uri);
  • Mike Hadlow
    Mike Hadlow over 10 years
    I use exactly that method in my RabbitMQ.Management.Client library. Have a look here: github.com/mikehadlow/EasyNetQ/tree/master/Source/…
  • Clay
    Clay over 10 years
    Targeting .NET 4.5 fixed it, even without the uri config setting. Perhaps it was a bug in the .NET framework.
  • X3074861X
    X3074861X over 5 years
    Seems to be back in .NET Core 2.0.