2012-10-23 6 views
5

私はWebアプリケーションにコールアウトする必要があるC#アプリケーションを作成しています。 System.Uriを使用して、2つのURLを結合しようとしています。ベースURLと、必要なWebアプリケーションの特定のサービス(または多く)に対する相対パス。私はwebappBackendURLという名前のクラスメンバを1つの場所に定義したいと思っており、すべての呼び出しはそこからビルドされています(webappBackendURLは私の例のように近く定義されていません)。URLとクエリ文字列部分をどのように組み合わせるか?

System.Uri webappBackendURL = new System.Uri("http://example.com/"); 
System.Uri rpcURL   = new System.Uri(webappBackendURL,"rpc/import"); 
// Result: http://example.com/rpc/import 

ただし、webappBackendURLにクエリ文字列が含まれている場合は、この機能は維持されません。

System.Uri webappBackendURL = new System.Uri("http://example.com/?authtoken=0x0x0"); 
System.Uri rpcURL   = new System.Uri(webappBackendURL,"rpc/import"); 
// Result: http://example.com/rpc/import <-- (query string lost) 

URLを結合する方法はありますか? .NETライブラリは広範囲なので、私はこれを処理する組み込みの方法を見落としたかもしれないと思っています。理想的には、私はこのようなURLを組み合わせることができるようにしたいと思います:

System.Uri webappBackendURL = new System.Uri("http://example.com/?authtoken=0x0x0"); 
System.Uri rpcURL   = new System.Uri(webappBackendURL,"rpc/import?method=overwrite&runhooks=true"); 
// Result: http://example.com/rpc/import?authtoken=0x0x0&method=overwrite&runhooks=true 

答えて

2

あなたはこのような何か行うことができます:私はおそらく2つのURIを受け取るメソッドを作成することになりますが

System.Uri webappBackendURL = 
    new System.Uri("http://example.com/?authtoken=0x0x0"); 
System.Uri rpcURL = new System.Uri(webappBackendURL, 
    "rpc/import?ethod=overwrite&runhooks=true" 
    + webappBackendURL.Query.Replace("?", "&")); 
1
System.Uri webappBackendURL = new System.Uri("http://example.com/?authtoken=0x0x0"); 
System.Uri rpcURL   = new System.Uri(webappBackendURL,string.Format("rpc/import?{0}method=overwrite&runhooks=true", string.IsNullOrWhiteSpace(webappBackendURL.Query) ? "":webappBackendURL.Query + "&")); 

をし、それは少しきれいに見えるように処理を行います。

public static Uri MergerUri(Uri uri1, Uri uri2) 
    { 
     if (!string.IsNullOrWhiteSpace(uri1.Query)) 
     { 
      string[] split = uri2.ToString().Split('?'); 

      return new Uri(uri1, split[0] + uri1.Query + "&" + split[1]); 
     } 
     else return new Uri(uri1, uri2.ToString()); 
    } 
+0

私は単純なパスから 'Uri'を構築しようとしたときに' UriFormatException'を打ったので、 'MergerUri'を確実に使うことはできません。あなたの最初の提案をメソッドにラップしようとするかもしれません。 – jimp

+0

申し訳ありませんが、私はまずそれをテストしませんでした。更新されたものは動作しますが、あなたが決めたものに似ています。 – jfin3204

1

UriTemplateをお試しください:

Uri baseUrl = new Uri("http://www.example.com"); 
UriTemplate template = new UriTemplate("/{path}/?authtoken=0x0x0"); 
Uri boundUri = template.BindByName(
    baseUrl, 
    new NameValueCollection {{"path", "rpc/import"}}); 

System.UriTemplateは、.NETの異なるバージョン間での周り移動しました。プロジェクトに適したアセンブリ参照を判断する必要があります。

+0

興味深いですね。私はそれを確認します、ありがとう。 – jimp

+0

あなたが求めていたものと最もよく似ているが、複数のテンプレート(/ {x}/{y}/foo)を持つことができるので、1つのパラメータしか使用しませんでした。明らかに、各プレースホルダのNameValueCollectionに1つのエントリが存在します。 –

0

受け取った回答のアイデアやピースを使用して、私が探していたものを正確に達成したラッパーメソッドを作成しました。私はコアの.NETクラスがこれを処理できることを期待していましたが、できないように見えました。

この方法では完全なURL(http://example.com?path?query=string)を使用し、relative/path?query=string&with=arguemntsの形式で相対URL(文字列)を結合します。

private static System.Uri ExtendURL(System.Uri baseURL, string relURL) 
{ 
    string[] parts = relURL.Split("?".ToCharArray(), 2); 
    if (parts.Length < 1) 
    { 
     return null; 
    } 
    else if (parts.Length == 1) 
    { 
     // No query string included with the relative URL: 
     return new System.Uri(baseURL, 
           parts[0] + baseURL.Query); 
    } 
    else 
    { 
     // Query string included with the relative URL: 
     return new System.Uri(baseURL, 
           parts[0] + (String.IsNullOrWhiteSpace(baseURL.Query) ? "?" : baseURL.Query + "&") + parts[1]); 
    } 
} 

ExtendURL(new System.Uri("http://example.com/?authtoken=0x0x0"),"rpc/import?method=overwrite&runhooks=true"); 
// Result: http://example.com/rpc/import?authtoken=0x0x0&method=overwrite&runhooks=true 

寄稿した皆さんありがとうございます!私はあなたの答えのすべてをアップしました。

関連する問題