WCF सेवा के लिए REST / SOAP अंतिम बिंदु


425

मेरे पास WCF सेवा है और मैं इसे RESTfull सेवा और SOAP सेवा दोनों के रूप में उजागर करना चाहता हूं। किसी ने पहले भी ऐसा कुछ किया है?


अच्छा सवाल और शानदार जवाब।
चंद्र आर.वी.

जवाबों:


584

आप सेवा को दो अलग-अलग समापन बिंदुओं में उजागर कर सकते हैं। 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 में नहीं है, तो संचालन के पैरामीटर में जटिल प्रकार नहीं हो सकता है।

SOAP और RESTful POX (XML) के लिए पोस्ट का उत्तर दें

सादे पुराने 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>

सेवा में उपलब्ध होगा

अन्य अनुरोध ब्राउज़र में इसे आज़माते हैं,

http://www.example.com/xml/accounts/A123

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

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


11
यह कैसा दिखता है जब मेरे पास .svc को कुछ आभासी निर्देशिका में IIS में होस्ट किया गया है जैसे someserver / myvirtualdir / service.svc ? मुझे इसे कैसे एक्सेस करना चाहिए?
सनी मिलेंव

मैं इसे एक कदम आगे ले जाना चाहता हूं और JSON पते के लिए HTTPS में एक बंधन जोड़ना चाहता हूं। मैं उसको कैसे करू? stackoverflow.com/questions/18213472/…
स्टीव

यह कह रहा है कि जब मैं अपने सेवा इंटरफ़ेस को संदर्भित करने का प्रयास करता हूं तो मेरा अनुबंध IEvents अमान्य है: <सेवा का नाम = "इवेंट"> <समापन बिंदु पता = "json" बाइंडिंग = "webHttpBinding" व्यवहारकॉन्फ़िगरेशन = "jsonBhavior" अनुबंध = "IEvents" />। मेरे IEvents में इंटरफ़ेस पर एक [ServiceContract] विशेषता है इसलिए सुनिश्चित नहीं है कि क्यों। </ सेवा>
पॉजिटिव

मुझे लोकलहोस्ट मिल सकता है : 44652 / MyResource / json काम करने के लिए लेकिन मुझे localhost काम करने के लिए id नहीं मिल सकती : 44652 / MyResource / 98 / json । मैंने "/ {id}" का UriTemplate जोड़ने की कोशिश की है, "इवेंट / {id} की भी कोशिश की है, लेकिन यह तब नहीं मिलता जब मैं सेवा को हिट करने की कोशिश करता हूं। केवल पहला काम करता है, यह सुनिश्चित नहीं है कि बाद में कैसे प्राप्त करें। काम करने के लिए।
पॉजिटिव जी

2
यह वहां बिना किसी भौतिक फ़ाइल के कैसे काम कर सकता है? मुझे बस 404 त्रुटियां लगती हैं, कुछ याद आ रही होगी
रोबो जेएम

39

"कम्युनिटी विकी" द्वारा इस पोस्ट का पहले से ही बहुत अच्छा जवाब है और मैं रिक स्ट्राल के वेब ब्लॉग को भी देखने की सलाह देता हूं, इस तरह के डब्ल्यूसीएफ रेस्ट के बारे में कई अच्छे पोस्ट हैं ।

मैंने इस तरह की 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){
    //...

मैं यह जानने के लिए उत्सुक हूं कि आप क्या विश्वास करते हैं कि आप इन WebGet और WebInvoke विशेषताओं को जोड़कर प्राप्त करेंगे।
डारेल मिलर

2
आप ब्राउज़र द्वारा अनुरोध कर सकते हैं: लोकलहोस्ट / MyService.svc / MyXmlResource / test और स्पष्ट रूप से Json या Xml प्रारूप में कहें। यदि आप दोनों का जवाब देने के लिए समान तरीके चाहते हैं, तो यहां एक लिंक दिया गया है: blogs.msdn.com/dotnetinterop/archive/2008/11/04/…
Tuomas Hietanen

यह परीक्षण प्रयोजनों के लिए है। बस यह देखने के लिए कि क्या आपके समापन बिंदु काम कर रहे हैं। क्या आपने सोपुई को देखा है? साबुनुई .2
डारेल मिलर

@TuomasHietanen - मुझे WebHttp व्यवहार का उपयोग करके JSON प्रकार की प्रतिक्रिया नहीं मिलती है, हालांकि enableWebScript का उपयोग करके मुझे JSON प्रकार प्रतिक्रिया मिलती है। मैंने ResponseFormat को WebMessageFormat.Json के रूप में रखा। दूसरी ओर मैं URItemplate का उपयोग नहीं कर सकता अगर मैं EnableWebScript व्यवहार का उपयोग करता हूं। कोई विचार?
स्माइल.डाल.डाइव

1
@ कॉफ़ी एडिक्ट - आपको पूर्णांक का उपयोग क्यों करना चाहिए? सिर्फ इंटरफ़ेस करने के लिए? आप कभी भी इस इंटरफ़ेस का उपयोग नहीं करेंगे। यह सरल है।
तुओमास हितांन

25

यदि आप केवल एक ही वेब सेवा विकसित करना चाहते हैं और इसे कई अलग-अलग समापन बिंदुओं (जैसे 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 को कॉन्फ़िगर करने में जितना समय लगेगा उससे कम;):


7

MSDN के पास इसके लिए अब एक लेख है:

https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx

परिचय:

डिफ़ॉल्ट रूप से, विंडोज कम्युनिकेशन फाउंडेशन (WCF) एंडपॉइंट्स को केवल SOAP क्लाइंट्स के लिए उपलब्ध कराता है। कैसे करें: एक मूल WCF वेब HTTP सेवा बनाएँ, एक समापन बिंदु गैर-सोप ग्राहकों को उपलब्ध कराया जाता है। ऐसे समय हो सकते हैं जब आप एक ही अनुबंध को वेब एंडपॉइंट के रूप में और सोप एंडपॉइंट के रूप में दोनों तरह से उपलब्ध कराना चाहते हैं। यह विषय ऐसा करने का एक उदाहरण दिखाता है।


3

हमें 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 का उपयोग कर सकते हैं ।


उम्मीद के
मुताबिक

0

यह वही है जो मैंने इसे बनाने के लिए किया था। सुनिश्चित करें कि आपने
वेबहॉट स्वचालितफ़ॉर्मैट सेलेक्शन इनेबल्ड = "सत्य" को एंडपॉइंट व्यवहार के अंदर रखा है।

[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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.