替换Uri中的主机


85

用.NET替换Uri的主机部分的最佳方法是什么?

即:

string ReplaceHost(string original, string newHostName);
//...
string s = ReplaceHost("http://oldhostname/index.html", "newhostname");
Assert.AreEqual("http://newhostname/index.html", s);
//...
string s = ReplaceHost("http://user:pass@oldhostname/index.html", "newhostname");
Assert.AreEqual("http://user:pass@newhostname/index.html", s);
//...
string s = ReplaceHost("ftp://user:pass@oldhostname", "newhostname");
Assert.AreEqual("ftp://user:pass@newhostname", s);
//etc.

System.Uri似乎没有太大帮助。

Answers:


147

System.UriBuilder是您所追求的...

string ReplaceHost(string original, string newHostName) {
    var builder = new UriBuilder(original);
    builder.Host = newHostName;
    return builder.Uri.ToString();
}

谢谢,这正是我想要的。
Rasmus Faber

1
我会推荐Uri班的,但是我会错的。好答案。
乔纳森·C·狄金森

效果很好,只要注意,如果您阅读Query属性,它前面会带有一个?,并且如果您将Query Property设置为以?开头的字符串,则另一个?将被前置。
戴夫

如果以原始端口或新端口指定了端口,则必须处理这些端口。
主观现实

42

正如@Ishmael所说,您可以使用System.UriBuilder。这是一个例子:

// the URI for which you want to change the host name
var oldUri = Request.Url;

// create a new UriBuilder, which copies all fragments of the source URI
var newUriBuilder = new UriBuilder(oldUri);

// set the new host (you can set other properties too)
newUriBuilder.Host = "newhost.com";

// get a Uri instance from the UriBuilder
var newUri = newUriBuilder.Uri;

3
我怀疑最好Uri通过调用newUriBuilder.Uri而不是格式化和解析实例来获取实例。
2013年

@Sam你是对的,该Uri属性是一个更好的选择。谢谢。更新。
Drew Noakes 2013年

小心.Uri通话。如果您的某些内容UriBuilder不能转换为有效的Uri,则会抛出该错误。因此,例如,如果您需要通配符主机*,则可以设置.Host为该主机,但是如果调用.Uri它,则会抛出该主机。如果您致电UriBuilder.ToString(),它将返回通配符就位的Uri。
CubanX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.