1

.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否则我不能使用 url。

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

4

3 回答 3

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吗?这将解决您的问题。

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

于 2013-02-27T19:16:06.810 回答
1

在我们有机会更新到 VS2012/.Net4.5 之前,我最终得到了一个自定义 Uri 类来包装 Uri。我正在处理的系统中的大多数 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;
    }
}
于 2013-02-28T09:55:53.430 回答
1

使用 AbsoluteUri 代替 ToString():

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

这给出了正确的结果:

http://localhost/?t=a%2bc
于 2013-07-09T20:19:52.203 回答