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はあまり役に立たないようです。

回答:


147

System.UriBuilderはあなたが求めているものです...

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

まさにそれが私が探していたものでした。
ラスマスフェイバー

1
私はウリクラスを推薦したでしょうが、私は間違っていたでしょう。いい答えだ。
ジョナサンCディキンソン

うまく機能します。Queryプロパティを読み取る場合は?が前に付き、Queryプロパティを?で始まる文字列で設定する場合は別の?が追加されます。
デイブ

元のポートまたは新しいポートのいずれかで指定されている場合は、ポートを処理する必要があります。
主観的現実

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フォーマットして解析するよりも、呼び出してインスタンスを取得する方が良いのではないかと思います。
サム

@サムあなたが正しい、Uriプロパティははるかに良いオプションです。ありがとう。更新しました。
ドリューノアケス2013年

.Uri呼び出しに注意してください。あなたはそれで何かを持っている場合はUriBuilder、有効なURIに変換されない、それがスローされます。したがって、たとえば、ワイルドカードホストが必要な*場合はそれに設定できますが.Host、呼び出す.Uriとスローされます。電話をかけるUriBuilder.ToString()と、ワイルドカードが設定されたURIが返されます。
CubanX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.