يمكن WebInvoke يتم استبدال سمات من تكوينات ملزمة

StackOverflow https://stackoverflow.com/questions/658195

  •  19-08-2019
  •  | 
  •  

سؤال

في أجل الحصول على خدمة WCF العمل مع مسج واضاف لقد سمة WebInvoke على عقد عملية للسيطرة على التسلسل JSON كما يلي:

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]

هل هناك طريقة للسيطرة على هذا التسلسل عن طريق ربط الخدمة في التكوين بدلا من ذلك لأنه يحد من هذه الخدمة من توفير serialisations مختلفة لنقاط النهاية مختلفة.

هل كانت مفيدة؟

المحلول

ولدي حل آخر، والذي يعمل في الطرف المقابل منMarc Gravell في: بدلا من تكرار العقد، تستمد 2 فئات مختلفة من الخدمة <م> التنفيذ . هذه ليست سوى كتابة الأسماء المستعارة. كانت ضرورية لأن النظام تفعيل صندوق رأس المال العامل (كما الأقل على IIS) لن تسمح لك لتنشيط نفس نوع الخدمة في عناوين المواقع المختلفة (لست متأكدا لماذا لم يتم تشغيل الحل Gravell لفي هذه المشكلة - الخطأ الذي أنا الحصول على هو "عملية تسجيل موجود بالفعل لURI ..." عندما أحاول لتنشيط نفس الفئة الخدمة في عناوين مختلفة في نفس الموقع). لاحظ أن هذا فقط مشكلة إذا كنت ترغب في تشغيل نفس الخدمة مع جدري وسلمان <م> في وقت واحد . إذا كان كل ما تريده هو للسيطرة على شكل ردا على ذلك، لا تحتاج هذا الحل.

والمفهوم الرئيسي وراء بلدي الحل هو استخدام 2 محددات مختلفة لنفس الخدمة، ثم استخدام سلوك نقطة النهاية لتعيين تنسيق الاستجابة الصادرة الافتراضية. يمكنك العثور على مزيد من المعلومات في هذا السؤال ، الذي يمس أيضا على نقاء المفاهيمي السؤال: يجب أن يكون باستخدام سمات العقد لتحديد الخصائص التي هي جزء من بروتوكول الشبكة؟ أعتقد أن تأخذ مارك Gravell بشأن هذه المسألة صالحا في حد ذاته، ولكنه لا يتفق المفهوم الأصلي للصندوق رأس المال العامل، والتي من المفترض أن تكون المستخرجة بعيدا عن مكدس البروتوكول عقود. ولكن سوف السلوكيات نقطة النهاية لا تسمح لك بتحديد كل الصفات المتعلقة REST، سيكون لديك لاستخدام سمات قوالب URI والشكل الوارد.

ويمكن أن بقية تم تنفيذها بشكل مختلف؟ على الرغم من أن مصممي WCF بعمل ممتاز في تصميم إطار عام، وأنا لا أعتقد أنهم رأوا REST المقبلة. بعض الأشياء، مثل القالب URI، حقا لا يبدو أن تنتمي للعقد.

ويكفي الحديث! هنا هو رمز. أولا ملف web.config. هذا هو المكان الذي يحدث السحر. علما بأنني أستخدم WCF 4 التكوين تفعيل مقرها في هذا المثال، ولكن يمكن أيضا تحقيق الشيء نفسه من خلال وجود ملفات 2 SVC لتمثيل محددات 2.

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="StackOverflow.QuoteOfTheDayAsJson">
        <endpoint binding="webHttpBinding" contract="StackOverflow.IQuoteOfTheDay" 
                  behaviorConfiguration="jsonBehavior" />
      </service>
      <service name="StackOverflow.QuoteOfTheDayAsPox">
        <endpoint binding="webHttpBinding" contract="StackOverflow.IQuoteOfTheDay" 
                  behaviorConfiguration="poxBehavior" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <webHttp defaultOutgoingResponseFormat="Json" />
        </behavior>
        <behavior name="poxBehavior">
          <webHttp defaultOutgoingResponseFormat="Xml"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false">
      <serviceActivations>
        <add relativeAddress="QuoteOfTheDayJson.svc" 
             service="StackOverflow.QuoteOfTheDayAsJson"/>
        <add relativeAddress="QuoteOfTheDayPox.svc" 
             service="StackOverflow.QuoteOfTheDayAsPox"/>
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>
</configuration>

وهنا هو الرمز، بما في ذلك عقد الخدمات وتنفيذ الخدمة، ونوع الأسماء المستعارة التي هي ضرورية لجعل هذا العمل:

namespace StackOverflow
{
    [DataContract]
    public class Quotation
    {
        [DataMember]
        public string Text { get; set; }

        [DataMember]
        public string Author { get; set; }
    }

    [ServiceContract]
    public interface IQuoteOfTheDay
    {
        [OperationContract]
        [WebInvoke(Method="GET", UriTemplate="GetTodaysQuote")]
        Quotation GetTodaysQuote();
    }

    public class QuoteOfTheDayImp : IQuoteOfTheDay
    {
        public Quotation GetTodaysQuote()
        {
            return new Quotation()
            {
                Text = "Sometimes it's better to appologize for not asking permission",
                Author = "Admiral Grace Murray Hopper"
            };
        }
    }

    /// <summary>
    /// A type alias used for json activation
    /// </summary>
    public class QuoteOfTheDayAsJson : QuoteOfTheDayImp 
    {}

    /// <summary>
    /// A type alias used for pox activation
    /// </summary>
    public class QuoteOfTheDayAsPox : QuoteOfTheDayImp
    {}
}

إذا لم يكن لضرورة نوع الأسماء المستعارة، وأنا أقول هذا هو الحل الكامل. بل هو حل كامل إذا كنت لا تريد لدعم صيغ متعددة في وقت واحد. هذا هو متفوقة على حل العقد متعددة في الاحترام الذي، منذ هناك عقد واحد فقط، لا تحتاج للحفاظ على العقود 2 متزامنة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top