แทนที่โฮสต์ใน Uri


88

วิธีที่ดีที่สุดในการแทนที่ส่วนโฮสต์ของ Uri โดยใช้. NET คืออะไร

ได้แก่ :

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 ดูเหมือนจะไม่ช่วยอะไรมาก

คำตอบ:


149

System.UriBuilderคือสิ่งที่คุณหลังจาก ...

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

1
ฉันจะแนะนำคลาส Uri แต่ฉันคิดผิด คำตอบที่ดี.
Jonathan C Dickinson

ใช้งานได้ดีโปรดทราบว่าถ้าคุณอ่านคุณสมบัติ Query มันจะถูกเติมด้วย? และถ้าคุณตั้งค่าคุณสมบัติ Query ด้วยสตริงที่ขึ้นต้นด้วย?, another? จะถูกนำหน้า
Dave

คุณจะต้องจัดการพอร์ตหากมีการระบุไว้ในแบบเดิมหรือแบบใหม่
Subjective Reality

43

ดังที่ @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ทรัพย์สินเป็นตัวเลือกที่ดีกว่ามาก ขอบคุณ. อัปเดตแล้ว
Drew Noakes

ระวังการ.Uriโทร หากคุณมีบางอย่างUriBuilderที่ไม่ได้แปลเป็น Uri ที่ถูกต้องมันจะโยน ตัวอย่างเช่นหากคุณต้องการโฮสต์ไวด์การ์ด*คุณสามารถตั้งค่า.Hostนั้นได้ แต่ถ้าคุณเรียก.Uriมันจะโยน หากคุณเรียกUriBuilder.ToString()มันจะส่งคืน Uri พร้อมกับสัญลักษณ์แทน
CubanX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.