Thay thế máy chủ lưu trữ trong Uri


85

Cách tốt nhất để thay thế phần máy chủ của Uri bằng .NET là gì?

I E:

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 dường như không giúp được gì nhiều.

Câu trả lời:


147

System.UriBuilder là thứ bạn đang theo đuổi ...

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

Cảm ơn đó là chính xác những gì tôi đang tìm kiếm.
Rasmus Faber

1
Tôi đã đề xuất lớp học Uri, nhưng tôi đã sai. Câu trả lời tốt.
Jonathan C Dickinson

Hoạt động tốt, chỉ cần lưu ý rằng nếu bạn đọc thuộc tính Truy vấn, nó sẽ được thêm vào trước bằng dấu?, Và nếu bạn đặt Thuộc tính truy vấn bằng một chuỗi bắt đầu bằng?, Cái khác? sẽ được thêm vào trước.
Dave

Bạn sẽ phải xử lý các cổng, nếu chúng được chỉ định ở dạng nguyên bản hoặc mới.
Thực tế chủ quan

42

Như @Ishmael nói, bạn có thể sử dụng System.UriBuilder. Đây là một ví dụ:

// 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
Tôi nghi ngờ rằng có thể tốt hơn để có được Uriphiên bản bằng cách gọi newUriBuilder.Urithay vì định dạng và phân tích cú pháp nó.
Sam

@Sam bạn nói đúng, Uritài sản là một lựa chọn tốt hơn nhiều. Cảm ơn. Đã cập nhật.
Drew Noakes

Cẩn thận với .Uricuộc gọi. Nếu bạn có thứ gì đó UriBuilderkhông dịch sang Uri hợp lệ, nó sẽ ném. Vì vậy, ví dụ: nếu bạn cần một máy chủ ký tự đại diện, *bạn có thể đặt .Hostthành đó, nhưng nếu bạn gọi .Urinó sẽ ném. Nếu bạn gọi, UriBuilder.ToString()nó sẽ trả về Uri với ký tự đại diện tại chỗ.
CubanX
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.