2008-09-17 5 views
14

कॉन्फ़िगर करना आसान बनाना मेरे पास डेस्कटॉप एप्लिकेशन द्वारा गतिशील रूप से जुड़े डब्ल्यूसीएफ वेब सेवाओं का एक सेट है।डब्ल्यूसीएफ को

मेरी समस्या वास्तव में विस्तृत कॉन्फ़िगरेशन सेटिंग्स है जो डब्ल्यूसीएफ को काम करने की आवश्यकता है। काम करने के लिए एसएसएल प्राप्त करना कस्टम सेटिंग्स शामिल है। काम करने के लिए एमटीओएम या कुछ और प्राप्त करना और अधिक की आवश्यकता है। आप संपीड़न चाहते हैं? यहां हम फिर से जाते हैं ...

डब्ल्यूसीएफ वास्तव में शक्तिशाली है - आप कनेक्ट करने के कई अलग-अलग तरीकों का उपयोग कर सकते हैं, लेकिन सभी में बहुत सारी विस्तृत कॉन्फ़िगरेशन शामिल है। यदि होस्ट और क्लाइंट पूरी तरह से मेल नहीं खाते हैं तो आपको त्रुटियों को समझने में कठिनाई होती है।

मैं डेस्कटॉप ऐप को कॉन्फ़िगर करने के लिए कहीं अधिक आसान बनाना चाहता हूं - आदर्श रूप से किसी प्रकार की ऑटो-डिस्कवरी। डेस्कटॉप ऐप के उपयोगकर्ता सिर्फ यूआरएल दर्ज करने में सक्षम होना चाहिए और बाकी बाकी करते हैं।

क्या कोई इसे करने का एक अच्छा तरीका जानता है?

मुझे पता है कि विजुअल स्टूडियो आपके लिए कॉन्फ़िगरेशन सेट कर सकता है, लेकिन मैं चाहता हूं कि डेस्कटॉप ऐप विभिन्न सर्वर सेट-अप की विस्तृत विविधता के आधार पर ऐसा करने में सक्षम हो।

मुझे पता है कि वीएस के औजारों का बाहरी रूप से उपयोग किया जा सकता है, लेकिन मैं डेस्कटॉप ऐप्स के उपयोगकर्ताओं को डब्ल्यूसीएफ विशेषज्ञों के लिए नहीं ढूंढ रहा हूं। मुझे पता है कि एमएस ने जानबूझकर जटिल बना दिया है।

क्या कोई तरीका, तंत्र, तृतीय पक्ष लाइब्रेरी या डब्ल्यूसीएफ सेटिंग्स की स्वत: खोज करने के लिए कुछ भी संभव है?

+0

"मुझे पता है कि एमएस ने जानबूझकर जटिल बना दिया है" [उद्धरण वांछित] –

+0

शायद यह अनुचित है। एमएस ने जानबूझकर इसे बनाया ताकि आप जिस भी सेटिंग को बदलना चाहें, वह हो सकता है, लेकिन आपको मूलभूत बातें स्थापित करने के लिए डब्ल्यूसीएफ पुस्तक और प्रोग्रामिंग अनुभव की आवश्यकता होगी। – Keith

उत्तर

9

एंडपॉइंट के बारे में सभी जानकारी किसी सेवा के मेटाडेटा में उपलब्ध है, तो आप एक ग्राहक लिख सकते हैं जो सेवा के मेटा डेटा का पता लगाएगा और ग्राहक को कॉन्फ़िगर करेगा। कोड उदाहरण के लिए आप जुवल लोवी से इस उत्कृष्ट Mex Explorer पर देख सकते हैं।

1

धन्यवाद, यह उपयोगी कोड (+1) था।

हालांकि यह कुछ छोटी गड़बड़ी है (उदाहरण के लिए केस संवेदनशील जांच जो नहीं होनी चाहिए), इसमें यूआई कार्यक्षमता का भार है जिसे मुझे बहुत सारे कोड की आवश्यकता नहीं है और दोहराता है।

मैंने इसे वास्तविक खोज तंत्र से लिया है, इसे फिर से लिखा है और लगभग इसे काम कर रहा है (कनेक्ट करता है, लेकिन कुछ उत्सुकता की आवश्यकता है)।

पहले कुछ util मुख्य विधि द्वारा उपयोग कार्य:

public static ServiceEndpointCollection Discover(string url) 
{ 
    Uri address = new Uri(url); 
    ServiceEndpointCollection endpoints = null; 

    if (string.Equals(address.Scheme, "http", StringComparison.OrdinalIgnoreCase)) 
    { 
     var httpBindingElement = new HttpTransportBindingElement(); 

     //Try the HTTP MEX Endpoint 
     try { endpoints = GetEndpoints(httpBindingElement, address, MetadataExchangeClientMode.MetadataExchange); } 
     catch { } 

     //Try over HTTP-GET 
     if (endpoints == null) 
      endpoints = GetEndpoints(httpBindingElement, 
       new Uri(AddWsdlQueryStringIfMissing(url)), MetadataExchangeClientMode.HttpGet); 
    } 
    else if (string.Equals(address.Scheme, "https", StringComparison.OrdinalIgnoreCase)) 
    { 
     var httpsBindingElement = new HttpsTransportBindingElement(); 

     //Try the HTTPS MEX Endpoint 
     try { endpoints = GetEndpoints(httpsBindingElement, address, MetadataExchangeClientMode.MetadataExchange); } 
     catch { } 

     //Try over HTTP-GET 
     if (endpoints == null) 
      endpoints = GetEndpoints(httpsBindingElement, 
       new Uri(AddWsdlQueryStringIfMissing(url)), MetadataExchangeClientMode.HttpGet); 
    } 
    else if (string.Equals(address.Scheme, "net.tcp", StringComparison.OrdinalIgnoreCase)) 
     endpoints = GetEndpoints(new TcpTransportBindingElement(), 
      address, MetadataExchangeClientMode.MetadataExchange); 

    else if (string.Equals(address.Scheme, "net.pipe", StringComparison.OrdinalIgnoreCase)) 
     endpoints = GetEndpoints(new NamedPipeTransportBindingElement(), 
      address, MetadataExchangeClientMode.MetadataExchange); 

    return endpoints; 
} 
1

अब एक और तरीका यह करने के लिए नहीं है:

/// <summary>If the url doesn't end with a WSDL query string append it</summary> 
static string AddWsdlQueryStringIfMissing(string input) 
{ 
    return input.EndsWith("?wsdl", StringComparison.OrdinalIgnoreCase) ? 
     input : input + "?wsdl"; 
} 

/// <summary>Imports the meta data from the specified location</summary> 
static ServiceEndpointCollection GetEndpoints(BindingElement bindingElement, Uri address, MetadataExchangeClientMode mode) 
{ 
    CustomBinding binding = new CustomBinding(bindingElement); 
    MetadataSet metadata = new MetadataExchangeClient(binding).GetMetadata(address, mode); 
    return new WsdlImporter(metadata).ImportAllEndpoints(); 
} 

फिर एक विधि है कि कनेक्ट करने के लिए अलग तरह से कोशिश करता है और अंतिम बिंदु रिटर्न जब मैंने मूल प्रश्न पूछा तो वह उपलब्ध नहीं था। माइक्रोसॉफ्ट अब डब्ल्यूसीएफ सेवाओं के लिए आरईएसटी का समर्थन करता है।

  • आरईएसटी का उपयोग करने का नकारात्मक पक्ष यह है कि आप डब्लूएसडीएल खो देते हैं।
  • ऊपर की ओर न्यूनतम कॉन्फ़िगरेशन है और आपका डब्ल्यूसीएफ अनुबंध इंटरफेस अभी भी काम करेगा!

    : एक .svc फ़ाइल जोड़ने -

आप या तो WebInvoke या WebGet

//get a user - note that this can be cached by IIS and proxies 
[WebGet] 
User GetUser(string id) 

//post changes to a user 
[WebInvoke] 
void SaveUser(string id, User changes) 

एक साइट के लिए इन जोड़ने के साथ System.ServiceModel.Web

मार्क अपने संचालन के लिए एक नया संदर्भ की आवश्यकता होगी आसान है

<%@ServiceHost 
    Service="MyNamespace.MyServiceImplementationClass" 
    Factory="System.ServiceModel.Activation.WebServiceHostFactory" %> 

फैक्ट्री लाइन एएसपीनेट को बताती है कि एंडपॉइंट को कैसे सक्रिय करें - आपको बिल्कुल कोई सर्वर साइड कॉन्फ़िगरेशन की आवश्यकता नहीं है!

तो निर्माण अपने ChannelFactory काफी अपरिवर्तित है, सिवाय इसके कि आप (के रूप में मैं अन्य उत्तर में है एक ऑटो की खोज या) कि समाप्ति बिंदु किसी भी अधिक निर्दिष्ट करने की आवश्यकता नहीं है

var cf = new WebChannelFactory<IMyContractInterface>(); 
var binding = new WebHttpBinding(); 

cf.Endpoint.Binding = binding; 
cf.Endpoint.Address = new EndpointAddress(new Uri("mywebsite.com/myservice.svc")); 
cf.Endpoint.Behaviors.Add(new WebHttpBehavior()); 

IMyContractInterface wcfClient = cf.CreateChannel(); 

var usr = wcfClient.GetUser("demouser"); 
// and so on... 

ध्यान दें कि मैं क्लाइंट कॉन्फ़िगरेशन निर्दिष्ट या खोज नहीं किया है - कोई स्थानीय कॉन्फ़िगरेशन आवश्यक नहीं है!

एक और बड़ा उलझन यह है कि आप आसानी से जेएसओएन क्रमबद्धता पर स्विच कर सकते हैं - जो जावा, एक्शनस्क्रिप्ट, जावास्क्रिप्ट, सिल्वरलाइट या किसी अन्य चीज से जेएसओएन और आरईएसटी को आसानी से संभालने वाली अन्य डब्ल्यूसीएफ सेवाओं को उपभोग करने की अनुमति देता है।

+0

मैंने यह भी ब्लॉग किया है कि यह क्यों बदल गया है: http://bizvprog.blogspot.com/2009/11/giving-up-on-soap-for-good.html – Keith