2012-10-23 17 views
5

मैं एक सी # एप्लिकेशन लिख रहा हूं जिसे वेबपैप पर कॉलआउट करने की आवश्यकता है। मैं दो यूआरएल को गठबंधन करने के लिए System.Uri का उपयोग करने की कोशिश कर रहा हूं: एक बेस यूआरएल और मुझे आवश्यक वेबपैम की विशिष्ट सेवा (या कई) के सापेक्ष पथ की आवश्यकता है। मेरे पास webappBackendURL नामक एक क्लास सदस्य है जिसे मैं एक ही स्थान पर परिभाषित करना चाहता हूं, जिसमें से सभी कॉल बिल्डिंग (webappBackendURL मेरे उदाहरणों के अनुसार बंद नहीं है)।संरक्षित स्ट्रिंग भागों वाले यूआरएल को कैसे गठबंधन किया जाए?

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) 

क्या यूआरएल को जोड़ने का एक बेहतर तरीका है? .NET लाइब्रेरी व्यापक है, इसलिए मुझे लगता है कि मैंने इसे संभालने के लिए अंतर्निहित तरीके से अनदेखा किया होगा। आदर्श रूप में, मैं इस तरह यूआरएल गठबंधन करने के लिए सक्षम होने के लिए करना चाहते हैं:

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

आप कुछ इस तरह कर सकता है: हालांकि मैं शायद एक विधि है कि दो यूआरआई लेता बनाना होगा

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

जब मैंने अपने सरल पथ से 'उरी' बनाने की कोशिश की, तो मैंने '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 नेट के विभिन्न संस्करणों के बीच चारों ओर ले जाया गया है। आपको यह निर्धारित करने की आवश्यकता होगी कि आपके प्रोजेक्ट के लिए कौन सा असेंबली संदर्भ सही है।

+0

दिलचस्प लग रहा है। मैं इसमें जांच करूंगा, धन्यवाद। – jimp

+0

मैंने केवल एक पैरामीटर का उपयोग किया क्योंकि आप जो भी मांग रहे थे उससे सबसे नज़दीकी मिलान किया गया था, लेकिन आपके पास एक से अधिक (/ {x}/{y}/foo) के साथ टेम्पलेट हो सकते हैं। जाहिर है, प्रत्येक प्लेसहोल्डर के लिए NameValueCollection में एक प्रविष्टि होगी। –

0

प्राप्त उत्तरों से विचारों और टुकड़ों का उपयोग करके, मैंने एक रैपर विधि लिखा जो वास्तव में मैंने जो खोजा था उसे हासिल किया। मुझे उम्मीद थी कि कोर .NET कक्षाएं इसे संभाल सकती हैं, लेकिन ऐसा लगता है कि वे नहीं कर सकते हैं।

यह विधि एक पूर्ण यूआरएल (http://example.com?path?query=string) ले जाएगी और relative/path?query=string&with=arguemnts के रूप में एक सापेक्ष यूआरएल (स्ट्रिंग) को गठबंधन करेगी।

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 

योगदान देने वाले सभी लोगों के लिए धन्यवाद! मैंने आपके सभी उत्तरों को उखाड़ फेंक दिया।

संबंधित मुद्दे