2012-10-23 12 views
5

Webapp'a bilgi vermesi gereken bir C# uygulaması yazıyorum. İki URL'yi birleştirmek için System.Uri'u kullanmaya çalışıyorum: Temel URL ve ihtiyacım olan web sunucusunun belirli hizmetine (veya birçoğuna) olan göreli yol. webappBackendURL isimli bir sınıf üyem var, tek bir yerde tanımlamak istediğim tek bir yerde, tüm çağrıları yapıyorum (webappBackendURL, örneklerimin gösterdiği gibi tanımlanmadı). URL'ler sorgu dizesi parçaları ile birleştirilir nasıl korunur?

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

Bu

webappBackendURL bir sorgu dizesi içeriyorsa ancak, bu korunmaz, çalışır.

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'leri birleştirmenin daha iyi bir yolu var mı? .NET kütüphanesi kapsamlı, bu yüzden bunu halletmek için yerleşik bir yolu gözden kaçırmış olabilirim.

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 

cevap

2

Böyle bir şey yapabileceğini: İdeal olarak, böyle URL'sini birleştirmek için muktedir istiyorum ben muhtemelen iki URI'ları götüren bir yöntem yaratacak rağmen

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 + "&")); 

ve orada işlem yapar, böylece biraz daha temiz görünüyordu.

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

Basit yolumdan bir Uri'yi oluşturmaya çalıştığımda bir "UriFormatException" a rastladım, bu yüzden "MergerUri" yi güvenilir bir şekilde kullanabileceğimi düşünmüyorum. İlk önerinizi bir yönteme sarmayı deneyebilirim. – jimp

+0

Üzgünüz, önce test etmedim. Güncellenen biri çalışacak, ancak karar verdiğiniz şeye benziyor. – jfin3204

1

UriTemplate deneyin:

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 farklı sürümleri arasında etrafında taşındı. Projeniz için hangi montaj referansının doğru olduğunu belirlemeniz gerekir.

+0

İlginç görünüyor. Kontrol edeceğim, teşekkürler. – jimp

+0

Sadece bir parametre kullandım çünkü en çok ne istediğinizi soruyordu, ancak birden fazla (/ {x}/{y}/foo) şablona sahip olabilirsiniz. Açıkçası, yer tutucuların her biri için NameValueCollection'da bir giriş olacaktır. –

0

Alınan yanıtlardan fikirler ve parçalar kullanarak, tam olarak aradığım şeyi elde eden bir sarmalayıcı yöntem yazdım. Temel .NET sınıflarının bunu halledebileceğini umuyordum ama yapamadıkları gibi görünüyor.

Bu yöntem, tam bir URL (http://example.com?path?query=string) alır ve relative/path?query=string&with=arguemnts biçiminde göreli URL (dize) biçiminde birleştirir.

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 

Katkıda bulunan herkese teşekkür ederiz! Bütün cevaplarını benden aldım.

İlgili konular