2013-07-31 42 views
29

Tôi đang tìm cách thay đổi kiểu chuẩn của một cá thể System.Uri cho trước với System.UriBuilder mà không có thao tác chuỗi crappy và hằng số ma thuật. Nói rằng tôi cóThay đổi lược đồ của System.Uri

var uri = new Uri("http://localhost/hello") 

và tôi cần phải thay đổi nó để 'https'. Vấn đề của tôi là giới hạn trong số UriBuilder ctors và Uri.Port mặc định là 80 (chúng ta có nên thay đổi thành 443? Hardcoding không?). Mã này phải tôn trọng tất cả Uri tính như thông tin có thể cơ bản auth, chuỗi truy vấn vv

Trả lời

71

Đã kết thúc với một này:

var uriBuilder = new UriBuilder(requestUrl) 
{ 
    Scheme = Uri.UriSchemeHttps, 
    Port = -1 // default port for scheme 
}; 
+1

Là một lưu ý - vì một lý do, các lĩnh vực tên chương trình không có sẵn cho các dự án PCL (xem [ở đây] (https://msdn.microsoft.com/en- chúng tôi/thư viện/hệ thống.uri.urischemehttps% 28v = vs.110% 29.aspx # Anchor_2)). – dadude999

+2

Chỉ để hoàn thành: điều này sẽ không hoạt động đối với URI với các cổng không mặc định (ví dụ: 'http: // localhost: 12345/hello' sẽ được thay đổi thành' https: // localhost/hello'). –

17

UserControl's answer hoạt động tốt trừ khi bạn phải chắc chắn cổng không mặc định là được lưu giữ trong URI.

Ví dụ: http://localhost:12345/hello phải trở thành https://localhost:12345/hello thay vì https://localhost/hello.

Dưới đây là làm thế nào để làm điều đó một cách dễ dàng:

public static string ForceHttps(string requestUrl) 
{ 
    var uri = new UriBuilder(requestUrl); 

    var hadDefaultPort = uri.Uri.IsDefaultPort; 
    uri.Scheme = Uri.UriSchemeHttps; 
    uri.Port = hadDefaultPort ? -1 : uri.Port; 

    return uri.ToString(); 
} 

Lưu ý rằng chúng ta phải đọc uri.Uri.IsDefaultPorttrước thiết uri.Scheme.

Dưới đây là một ví dụ làm việc: https://dotnetfiddle.net/pDrF7s