【问题标题】:How to avoid that UriBuilder creates Uri with unencoded + sign in its query string?如何避免 UriBuilder 在其查询字符串中创建带有未编码 + 符号的 Uri?
【发布时间】:2013-02-27 17:21:47
【问题描述】:

.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,但我希望加号像http://localhost/?t=a%2bc一样被编码为%2b,否则我不能使用这个url。

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

【问题讨论】:

标签: asp.net urlencode


【解决方案1】:

有趣的是,这似乎在 .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 吗?这将解决您的问题。

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

【讨论】:

  • 有趣。我现在在 VS2010 上,但计划很快升级到 2012(一个月左右)。但是,现在我需要使用 2010 修复错误。请参阅我的答案以了解我最终使用的临时解决方法。但我将您标记为已接受,因为它是长期解决方案。
【解决方案2】:

在我们有机会更新到 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;
    }
}

【讨论】:

    【解决方案3】:

    使用 AbsoluteUri 代替 ToString():

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

    这给出了正确的结果:

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

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多