2012-11-26 30 views
19

Tôi muốn trích xuất chuỗi truy vấn và phân đoạn từ URI tương đối, tức là URI không có bất kỳ thông tin chương trình hoặc máy chủ nào.Phân tích tương đối URI

Có cách nào thanh lịch hơn để thực hiện việc này bằng cách biến nó thành một URI tuyệt đối với tên máy chủ giả không?

var relativeUri = "/dir1/dir2/file?a=b&c=d#fragment"; 
var uri = new Uri(new Uri("http://example.com"), relativeUri); 
var path = Uri.UnescapeDataString(String.Concat(uri.Segments)); 
var query = uri.Query; 
var fragment = uri.Fragment; 
// path = "/dir1/dir2/file", query = "?a=b&c=d", fragment = "#fragment" 

Trả lời

12

Mặc dù bạn có thể tạo một Uri mà không có một phần host, hầu hết các thuộc tính của nó sau đó sẽ ném một InvalidOperationException ("Thao tác này không được hỗ trợ cho một URI tương đối") vì những thuộc tính dựa vào một Uri tuyệt đối .

HttpUtility.ParseQueryString() thực sự sẽ không giúp ích gì ở đây, vì nó chỉ hoạt động trên phần truy vấn của Uri mà bạn không thể có được vì bạn không có Uri tuyệt đối.

Vì vậy, mặc dù nó có vẻ như là hacky, tôi nghĩ rằng trình biên dịch new Uri(baseUri, relativeUri) thực hiện chính xác những gì bạn muốn. Tôi dường như không thể tìm thấy một cách tốt hơn hoặc sạch hơn để thực hiện tương tự.

+0

Trên thực tế, 'HttpUtility.ParseQueryString()' làm việc với URL tương đối cũng . Một chút muộn để các bên - nhưng đã được kiểm tra một cái gì đó tương tự :) – NomadTraveler

+1

@Nomad Tôi sợ nó không. 'HttpUtility.ParseQueryString ("/dir1/dir2/file? A = b & c = d # fragment ");' đưa ra hai kết quả: '/ dir1/dir2/file? A = b' và' c = d # fragment', hoàn toàn không phải những gì bạn quan tâm. Bạn thực sự cần truyền nó chỉ một chuỗi truy vấn. – CodeCaster

0

Chạy vào vấn đề này bản thân tôi thấy rằng HttpUtility.ParseQueryString thực sự chỉ tìm kiếm một chuỗi và bất kỳ điều gì sau '?'

nên được rằng tôi có sử dụng điều này trong cả hai trường hợp (tương đối và tuyệt đối) Tôi tìm thấy những điều sau đây dường như làm việc khá tốt

HttpUtility.ParseQueryString(a.Attributes["href"].Value.Split('?').Last()) 
Các vấn đề liên quan