如何避免UriBuilder在查询字符串中使用未编码的+符号创建Uri?

时间:2013-02-27 17:21:48

标签: asp.net urlencode

我在.Net中使用UriBuilder和Uri课时遇到了一些麻烦。我想用UriBuilder构建我的Uri,然后使用生成的Uri。但是,我无法正确编码其查询字符串中的加号?

这是一个小代码示例:

var ub = new UriBuilder();
ub.Query = "t=a%2bc";
Console.WriteLine(ub.Uri.ToString());

这个例子给了我http://localhost/?t=a+c,但我希望加号被编码为%2b,就像这个http://localhost/?t=a%2bc一样,否则我不能使用网址。

我当然可以构建一个字符串,但如果可能的话,我更愿意使用强类型的Uri。

3 个答案:

答案 0 :(得分:2)

有趣的是,这似乎在.NET 4.5中被“修复”了。

这是我在.NET 4.0 中测试的结果:(来自即时窗口)

? ub.Uri.ToString()
"http://localhost/?t=a+c"
.NET中

4.5

? ub.Uri.ToString()
"http://localhost/?t=a%2bc"

您正在寻找的是什么。

你可以升级到4.5吗?这可以解决您的问题。

如果你无法升级,请告诉我,我会尝试找到解决方法。

答案 1 :(得分:1)

我最终定制了包含Uri的自定义Uri类,直到我们有机会更新到VS2012 / .Net4.5。我工作的系统中的大多数Uris不是通过新建Uris创建的,而是使用Querybuilder方法创建的,这意味着交换该部分以返回Uri2而不是Uri是“容易的”。

public class Uri2 : Uri
{
    public Uri2(Uri uri)
        : base(uri.ToString())
    {

    }

    public override string ToString()
    {
        var s = base.ToString();
        s = s.Replace("+", "%2b");
        return s;
    }
}

答案 2 :(得分:1)

使用AbsoluteUri而不是ToString():

var ub = new UriBuilder();
ub.Query = "t=a%2bc";
Console.WriteLine(ub.Uri.AbsoluteUri);

这给出了正确的结果:

http://localhost/?t=a%2bc