2010-03-02 9 views
6

में एमईएक्स/डब्लूएसडीएल से आरईएसटी एंडपॉइंट छुपाएं मेरे पास एक डब्ल्यूसीएफ सेवा है जिसमें प्रत्येक सेवा के लिए आरईएसटी और एसओएपी एंडपॉइंट हैं। यह इस पोस्ट के लिए इसी तरह लागू किया गया था: एक विन्यास निम्न के समान के साथ REST/SOAP endpoints for a WCF service:डब्ल्यूसीएफ

<services> 
    <service name="TestService"> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/> 
    <endpoint address="rest" binding="webHttpBinding" contract="ITestService"/> 
    </service> 
</services> 

समस्या यह है कि REST एंडपॉइंट एक अतिरिक्त बंदरगाह और बाध्यकारी के रूप में जिसके परिणामस्वरूप डबल्यूएसडीएल में दिखाई देता है।

क्या आरएसटी एंडपॉइंट को डब्लूएसडीएल में शामिल होने से रोकने का कोई तरीका है?

उत्तर

1

IWsdlExportExtension का उपयोग करके ऐसा करने का तरीका मिला। ऐसा करने के लिए शायद एक और मजबूत/पुन: प्रयोज्य तरीका है, लेकिन इस समाधान के लिए सभी आरईएसटी एंडपॉइंट्स के सम्मेलन की आवश्यकता है जिसे "आरईएसटी" रखा जा सके।

public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context) 
{ 
    // Remove all REST references (binding & port) from SOAP WSDL 
    foreach (ServiceDescription wsdl in exporter.GeneratedWsdlDocuments) 
    { 
     // Remove REST bindings 
     foreach (Binding binding in wsdl.Bindings) 
     { 
      if (binding.Name == "REST") 
      { 
       wsdl.Bindings.Remove(binding); 
       break; 
      } 
     } 

     // Remove REST ports 
     foreach (Service service in wsdl.Services) 
     { 
      foreach (Port port in service.Ports) 
      { 
       if (port.Name == "REST") 
       { 
        service.Ports.Remove(port); 
        break; 
       } 
      } 
     } 
    } 
} 
1

आप डब्लूएसडीएल की एक प्रति प्राप्त कर सकते हैं, मैन्युअल रूप से अवांछित कलाकृतियों को हटाने के लिए इसे संपादित कर सकते हैं, और इसे किसी ज्ञात स्थान पर संग्रहीत कर सकते हैं। एक बार जब आप कि अवांछित कलाकृतियों को हटा अपने डबल्यूएसडीएल का संस्करण है, आप उस स्थान पर रीडायरेक्ट कर सकते हैं wsdl क्वेरी:

<behaviors> 
<serviceBehaviors> 
    <behavior name="TestServiceBehavior"> 
    <serviceMetadata httpGetEnabled="True" externalMetadataLocation="http://localhost/TestService.wsdl"/> 
    </behavior> 
</serviceBehaviors> 
</behaviors> 

इस समाधान के बारे में कुछ चेतावनियां। आपको संपादित करने के बारे में सावधान रहना होगा। यदि आप अनुबंध के महत्वपूर्ण पहलुओं को बदलते हैं, तो डब्ल्यूसीएफ इससे उत्पन्न ग्राहकों से संदेशों को संभालने में सक्षम नहीं हो सकता है। एंडपॉइंट को हटाने का आमतौर पर एक बड़ा सौदा नहीं होता है, हालांकि बाइंडिंग, ऑपरेशंस, संदेश प्रकार इत्यादि के लिए नाम बदलना समस्याएं पैदा कर सकता है।

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

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

+0

मैनुअल समाधान काम करेंगे, लेकिन जैसा कि आप बाहर बिंदु, यह आदर्श से दूर है: नीचे एक Endpoint व्यवहार सभी बाकी अंतिम बिंदुओं को संलग्न के प्रासंगिक हिस्सा है। बेहतर या बदतर के लिए, यह सेवा समय-समय पर नई विधियों के साथ विकसित हो जाएगी, इसलिए अनुबंध बदल जाएगा। मैं एक और अधिक स्वचालित समाधान की तलाश में हूं, इसलिए मुझे हर सेवा वृद्धि पर डब्लूएसडीएल के साथ मिलना याद रखना नहीं है। – WayneC

+1

कोई कारण नहीं है कि आप प्रक्रिया को स्वचालित नहीं कर सके। यह सभी एक्सएमएल है, और यह कुछ प्रक्रिया लिखने के लिए काफी आसान होना चाहिए, शायद एक पावरहेल स्क्रिप्ट भी, जो आपकी तैनाती प्रक्रिया के हिस्से के रूप में चलती है। यह सामान्य से सभी फ़ाइलों को खींच सकता है? Wsdl क्वेरी, आवश्यक तत्व को खोजने और निकालने के लिए XPath का उपयोग करें, और सभी .wsdl और .xsd फ़ाइलों को तैनात करें। अंत में, यह आपके बाध्यकारी व्यवहार में तत्व जोड़ने के लिए स्वचालित रूप से कॉन्फ़िगरेशन अपडेट कर सकता है। – jrista

1

यह अच्छा होगा अगर एंडपॉइंट को सजाने के लिए कोई विशेषता थी ताकि यह वास्तव में इस कारण से डब्ल्यूसीएफ के भविष्य के संस्करणों में मेक्सिको/wsdl पीढ़ी से छिपा हुआ हो (साबुन ग्राहकों से आराम से सेवाएं छुपाएं)।