2012-11-26 10 views
19

私は、クエリ文字列とフラグメントを相対URI、つまりスキームやホスト情報のないURIから抽出したいと考えています。相対URIを解析する

これを行うには、偽のホスト名で絶対URIにするよりも、これを行うよりエレガントな方法がありますか?

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" 

答えて

12

あなたがホスト部分なしUriを作成することもできますが、そのプロパティのほとんどは、これらのプロパティは、絶対URIに依存しているため(「この操作は相対URIでサポートされていません」)と、InvalidOperationExceptionがスローされます。

HttpUtility.ParseQueryString()は実際にはUriのクエリ部分でしか動作しないため、実際にはここで助けにはなりません。Uriの絶対値がないために取得できないためです。

だから、ハッキーに見えるかもしれませんが、私はnew Uri(baseUri, relativeUri)コントラストがあなたが望むものを正確に行うと思います。私はそれを達成するためのより良い、またはよりクリーンな方法を見つけるように見えることはできません。

+0

実は、 'HttpUtility.ParseQueryString()は'だけでなく相対URLで動作します 。少し遅れてパーティーに行きましたが、似たようなものをチェックしていました:) – NomadTraveler

+1

@Nomad私はそうではないと恐れています。 '/ dir1/dir2/file?a = b'と' c = d#fragment'の2つの結果を生成します。あなたが本当に興味を持っているものではありません。本当にクエリ文字列を渡す必要があります。 – CodeCaster

0

私自身、この問題に直面して、HttpUtility.ParseQueryStringは実際には文字列だけを探していて、 '?'

はので、私は、私は次のfind(相対および絶対)は非常によく働くようで、両方のケースでこれを使用する必要があることであること

HttpUtility.ParseQueryString(a.Attributes["href"].Value.Split('?').Last()) 
関連する問題