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();
}

내가 찾던 바로 그게 감사합니다.
Rasmus Faber

1
나는 Uri 수업을 추천했지만 내가 틀렸을 것입니다. 좋은 대답입니다.
Jonathan C Dickinson

잘 작동합니다. Query 속성을 읽으면 앞에?가 추가되고?로 시작하는 문자열로 Query 속성을 설정하면 다른? 앞에 추가됩니다.
Dave

원본 또는 새 포트로 지정된 경우 포트를 처리해야합니다.
주관적 현실

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것보다 호출 하여 인스턴스 를 얻는 것이 더 낫다고 생각 합니다.
Sam

@ 샘 당신 말이 맞아요, Uri속성은 훨씬 더 나은 선택입니다. 감사. 업데이트되었습니다.
Drew Noakes 2013-06-14

.Uri전화 조심하세요 . UriBuilder유효한 Uri로 번역되지 않는 항목이 있으면 throw됩니다. 예를 들어 와일드 카드 호스트가 필요한 경우이를 *설정할 수 .Host있지만 호출 .Uri하면 발생합니다 . 호출 UriBuilder.ToString()하면 와일드 카드가있는 Uri가 반환됩니다.
CubanX
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.