मेरे पास WCF सेवा है और मैं इसे RESTfull सेवा और SOAP सेवा दोनों के रूप में उजागर करना चाहता हूं। किसी ने पहले भी ऐसा कुछ किया है?
मेरे पास WCF सेवा है और मैं इसे RESTfull सेवा और SOAP सेवा दोनों के रूप में उजागर करना चाहता हूं। किसी ने पहले भी ऐसा कुछ किया है?
जवाबों:
आप सेवा को दो अलग-अलग समापन बिंदुओं में उजागर कर सकते हैं। SOAP एक बाइंडिंग का उपयोग कर सकता है जो SOAP जैसे बेसिकहेटबाइंडिंग का समर्थन करता है, RESTful एक वेबहॉटबाइंडिंग का उपयोग कर सकता है। मुझे लगता है कि आपकी REST सेवा JSON में होगी, उस स्थिति में, आपको निम्न व्यवहार कॉन्फ़िगरेशन के साथ दो समापन बिंदु कॉन्फ़िगर करने की आवश्यकता है
<endpointBehaviors>
<behavior name="jsonBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
आपके परिदृश्य में समापन बिंदु कॉन्फ़िगरेशन का एक उदाहरण है
<services>
<service name="TestService">
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="json" binding="webHttpBinding" behaviorConfiguration="jsonBehavior" contract="ITestService"/>
</service>
</services>
इसलिए, सेवा में उपलब्ध होगा
इसे पुनर्जीवित करने के लिए ऑपरेशन अनुबंध पर [वेबगेट] लागू करें। जैसे
public interface ITestService
{
[OperationContract]
[WebGet]
string HelloWorld(string text)
}
ध्यान दें, यदि REST सेवा JSON में नहीं है, तो संचालन के पैरामीटर में जटिल प्रकार नहीं हो सकता है।
सादे पुराने XML के लिए रिटर्न फॉर्मेट के रूप में, यह एक उदाहरण है जो SOAP और XML दोनों के लिए काम करेगा।
[ServiceContract(Namespace = "http://test")]
public interface ITestService
{
[OperationContract]
[WebGet(UriTemplate = "accounts/{id}")]
Account[] GetAccount(string id);
}
अन्य सादे पुराने XML के लिए POX व्यवहार
<behavior name="poxBehavior">
<webHttp/>
</behavior>
endpoints
<services>
<service name="TestService">
<endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
<endpoint address="xml" binding="webHttpBinding" behaviorConfiguration="poxBehavior" contract="ITestService"/>
</service>
</services>
सेवा में उपलब्ध होगा
अन्य अनुरोध ब्राउज़र में इसे आज़माते हैं,
SOAP अनुरोध क्लाइंट एंडपॉइंट कॉन्फ़िगरेशन सेवा संदर्भ जोड़ने के बाद SOAP सेवा के लिए,
<client>
<endpoint address="http://www.example.com/soap" binding="basicHttpBinding"
contract="ITestService" name="BasicHttpBinding_ITestService" />
</client>
C # में
TestServiceClient client = new TestServiceClient();
client.GetAccount("A123");
इसे करने का एक और तरीका दो अलग-अलग सेवा अनुबंध और प्रत्येक को विशिष्ट कॉन्फ़िगरेशन के साथ उजागर करना है। यह कोड स्तर पर कुछ डुप्लिकेट उत्पन्न कर सकता है, हालांकि दिन के अंत में, आप इसे काम करना चाहते हैं।
"कम्युनिटी विकी" द्वारा इस पोस्ट का पहले से ही बहुत अच्छा जवाब है और मैं रिक स्ट्राल के वेब ब्लॉग को भी देखने की सलाह देता हूं, इस तरह के डब्ल्यूसीएफ रेस्ट के बारे में कई अच्छे पोस्ट हैं ।
मैंने इस तरह की MyService- सेवा को प्राप्त करने के लिए दोनों का उपयोग किया ... फिर मैं jQuery या SOAP से जावा से REST- इंटरफ़ेस का उपयोग कर सकता हूं।
यह मेरे Web.Config से है:
<system.serviceModel>
<services>
<service name="MyService" behaviorConfiguration="MyServiceBehavior">
<endpoint name="rest" address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="restBehavior"/>
<endpoint name="mex" address="mex" binding="mexHttpBinding" contract="MyService"/>
<endpoint name="soap" address="soap" binding="basicHttpBinding" contract="MyService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="restBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
और यह मेरी सेवा-श्रेणी है (.svc-codebehind, कोई इंटरफेस आवश्यक नहीं):
/// <summary> MyService documentation here ;) </summary>
[ServiceContract(Name = "MyService", Namespace = "http://myservice/", SessionMode = SessionMode.NotAllowed)]
//[ServiceKnownType(typeof (IList<MyDataContractTypes>))]
[ServiceBehavior(Name = "MyService", Namespace = "http://myservice/")]
public class MyService
{
[OperationContract(Name = "MyResource1")]
[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "MyXmlResource/{key}")]
public string MyResource1(string key)
{
return "Test: " + key;
}
[OperationContract(Name = "MyResource2")]
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource/{key}")]
public string MyResource2(string key)
{
return "Test: " + key;
}
}
वास्तव में मैं केवल Json या Xml का उपयोग करता हूं, लेकिन वे दोनों एक डेमो उद्देश्य के लिए यहां हैं। वे डेटा प्राप्त करने के लिए GET-request हैं। डेटा डालने के लिए मैं विशेषताओं के साथ विधि का उपयोग करूंगा:
[OperationContract(Name = "MyResourceSave")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")]
public string MyResourceSave(string thing){
//...
यदि आप केवल एक ही वेब सेवा विकसित करना चाहते हैं और इसे कई अलग-अलग समापन बिंदुओं (जैसे SOAP + REST, XML, JSON, CSV, HTML आउटपुट के साथ) पर होस्ट किया है। आपको ServiceStack का उपयोग करने पर भी विचार करना चाहिए, जो मैंने इस उद्देश्य के लिए बनाया है, जहां आपके द्वारा विकसित की जाने वाली प्रत्येक सेवा SOAP और REST के सभी समापन बिंदुओं पर स्वतः उपलब्ध है, बिना किसी कॉन्फ़िगरेशन के।
नमस्ते विश्व उदाहरण से पता चलता है बस (कोई config) की आवश्यकता के साथ सेवा के साथ एक सरल बनाने का तरीका:
public class Hello {
public string Name { get; set; }
}
public class HelloResponse {
public string Result { get; set; }
}
public class HelloService : IService
{
public object Any(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
किसी अन्य कॉन्फ़िगरेशन की आवश्यकता नहीं है, और यह सेवा तुरंत REST के साथ उपलब्ध है:
यह एक अनुकूल HTML आउटपुट के साथ भी बनाया गया है (जब इसे एक HTTP क्लाइंट के साथ कहा जाता है जिसमें Accept: text / html उदा ब्राउज़र होता है) तो आप बेहतर तरीके से अपनी सेवाओं के आउटपुट की कल्पना कर सकते हैं।
विभिन्न REST क्रियाओं को संभालना भी तुच्छ के रूप में है, यहाँ C # के 1 पृष्ठ में एक पूर्ण REST- सेवा CRUD ऐप है (WCF को कॉन्फ़िगर करने में जितना समय लगेगा उससे कम;):
MSDN के पास इसके लिए अब एक लेख है:
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
परिचय:
डिफ़ॉल्ट रूप से, विंडोज कम्युनिकेशन फाउंडेशन (WCF) एंडपॉइंट्स को केवल SOAP क्लाइंट्स के लिए उपलब्ध कराता है। कैसे करें: एक मूल WCF वेब HTTP सेवा बनाएँ, एक समापन बिंदु गैर-सोप ग्राहकों को उपलब्ध कराया जाता है। ऐसे समय हो सकते हैं जब आप एक ही अनुबंध को वेब एंडपॉइंट के रूप में और सोप एंडपॉइंट के रूप में दोनों तरह से उपलब्ध कराना चाहते हैं। यह विषय ऐसा करने का एक उदाहरण दिखाता है।
हमें REST समापन बिंदु पर व्यवहार कॉन्फ़िगरेशन को परिभाषित करना चाहिए
<endpointBehaviors>
<behavior name="restfulBehavior">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
</behavior>
</endpointBehaviors>
और एक सेवा के लिए भी
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
व्यवहार के बाद, अगला कदम बाइंडिंग है। के लिए उदाहरण के लिए basicHttpBinding सोप endpoint और करने के लिए WebHttpBinding बाकी ।
<bindings>
<basicHttpBinding>
<binding name="soapService" />
</basicHttpBinding>
<webHttpBinding>
<binding name="jsonp" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
अंत में हमें सेवा की परिभाषा में 2 समापन बिंदु को परिभाषित करना चाहिए। समापन बिंदु के पते = "" के लिए ध्यान दें, जहां आरईएसटी सेवा आवश्यक नहीं है।
<services>
<service name="ComposerWcf.ComposerService">
<endpoint address="" behaviorConfiguration="restfulBehavior" binding="webHttpBinding" bindingConfiguration="jsonp" name="jsonService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="soap" binding="basicHttpBinding" name="soapService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="mex" binding="mexHttpBinding" name="metadata" contract="IMetadataExchange" />
</service>
</services>
सेवा के इंटरफ़ेस में हम ऑपरेशन को इसकी विशेषताओं के साथ परिभाषित करते हैं।
namespace ComposerWcf.Interface
{
[ServiceContract]
public interface IComposerService
{
[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/autenticationInfo/{app_id}/{access_token}", ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
Task<UserCacheComplexType_RootObject> autenticationInfo(string app_id, string access_token);
}
}
सभी पक्षों को मिलाकर, यह हमारी WCF system.serviceModel परिभाषा होगी।
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="restfulBehavior">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" automaticFormatSelectionEnabled="False" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding name="soapService" />
</basicHttpBinding>
<webHttpBinding>
<binding name="jsonp" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="ComposerWcf.ComposerService">
<endpoint address="" behaviorConfiguration="restfulBehavior" binding="webHttpBinding" bindingConfiguration="jsonp" name="jsonService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="soap" binding="basicHttpBinding" name="soapService" contract="ComposerWcf.Interface.IComposerService" />
<endpoint address="mex" binding="mexHttpBinding" name="metadata" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
दोनों समापन बिंदु का परीक्षण करने के लिए, हम WCFClient को SOAP और PostMan to REST का उपयोग कर सकते हैं ।
यह वही है जो मैंने इसे बनाने के लिए किया था। सुनिश्चित करें कि आपने
वेबहॉट स्वचालितफ़ॉर्मैट सेलेक्शन इनेबल्ड = "सत्य" को एंडपॉइंट व्यवहार के अंदर रखा है।
[ServiceContract]
public interface ITestService
{
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/product", ResponseFormat = WebMessageFormat.Json)]
string GetData();
}
public class TestService : ITestService
{
public string GetJsonData()
{
return "I am good...";
}
}
सर्विस मॉडल के अंदर
<service name="TechCity.Business.TestService">
<endpoint address="soap" binding="basicHttpBinding" name="SoapTest"
bindingName="BasicSoap" contract="TechCity.Interfaces.ITestService" />
<endpoint address="mex"
contract="IMetadataExchange" binding="mexHttpBinding"/>
<endpoint behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
name="Http" contract="TechCity.Interfaces.ITestService" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8739/test" />
</baseAddresses>
</host>
</service>
EndPoint व्यवहार
<endpointBehaviors>
<behavior name="jsonBehavior">
<webHttp automaticFormatSelectionEnabled="true" />
<!-- use JSON serialization -->
</behavior>
</endpointBehaviors>