我在.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。
答案 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