نقاط نهاية REST/SOAP لخدمة WCF




(4)

لدي خدمة WCF وأريد عرضه كخدمة RESTFULL وكخدمة SOAP. هل قام أي شخص بشيء كهذا من قبل؟


إذا كنت ترغب فقط في تطوير خدمة ويب واحدة واستضافتها على العديد من النقاط النهائية المختلفة (أي SOAP + REST ، مع XML ، JSON ، CSV ، HTML outputes). يجب أن تفكر أيضًا في استخدام ServiceStack التي قمت ببنائها لهذا الغرض تمامًا حيث تتوفر كل الخدمات التي تقوم بتطويرها تلقائيًا على كلا نقطتي SOAP و REST من خارج الصندوق دون الحاجة إلى أي تهيئة.

يوضح مثال Hello World كيفية إنشاء خدمة بسيطة باستخدام فقط (لا يلزم وجود تهيئة):

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 المختلفة هي أيضا تافهة ، وهنا تكمن كاملة التطبيق CRUD REST الخدمة في 1 صفحة من C # (أقل مما يتطلبه تكوين WCF ؛):


هذا المقال يحتوي على إجابة جيدة جدا من "ويكي المجتمع" وأوصي أيضا أن ننظر إلى مدونة الويب ريك ستراهل ، هناك العديد من المشاركات الجيدة حول WCF بقية مثل this .

اعتدت على الحصول على هذا النوع من خدمة MyService ... ثم يمكنني استخدام واجهة REST من jQuery أو SOAP من Java.

هذا من 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 للحصول على البيانات. لإدراج البيانات ، سأستخدم طريقة ذات سمات:

[OperationContract(Name = "MyResourceSave")]
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "MyJsonResource")]
public string MyResourceSave(string thing){
    //...

يبدو أن MSDN تحتوي على مقالة لهذا الآن:

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

مقدمة:

افتراضيًا ، توفر مؤسسة Windows Communication Foundation (WCF) نقاط نهاية متاحة فقط لعملاء SOAP. في كيفية: إنشاء خدمة HTTP Web WCF الأساسية ، يتم توفير نقطة نهاية للعملاء غير SOAP. قد تكون هناك أوقات تريد فيها إتاحة نفس العقد لكلا الطريقتين ، كنقطة نهاية ويب وكنقطة نهاية SOAP. يعرض هذا الموضوع مثالاً لكيفية القيام بذلك.


يجب علينا تحديد تكوين السلوك إلى نقطة نهاية 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 إلى نقطة نهاية SOAP و webHttpBinding إلى REST .

<bindings>
   <basicHttpBinding>
     <binding name="soapService" />
   </basicHttpBinding>
   <webHttpBinding>
     <binding name="jsonp" crossDomainScriptAccessEnabled="true" />
   </webHttpBinding>
</bindings>

أخيرا يجب أن نحدد نقطة النهاية 2 في تعريف الخدمة. الانتباه إلى عنوان = "" نقطة النهاية ، حيث REST الخدمة ليست ضرورية شيء.

<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 إلى REST .





soap