2009-03-18 15 views
6

द्वारा प्रतिस्थापित किया जा क्रम JQuery के साथ काम करने के लिए एक WCF सेवा प्राप्त करने के लिए मैं आपरेशन अनुबंध JSON क्रमबद्धता को नियंत्रित करने पर एक WebInvoke विशेषता के रूप में इस जोड़ लिया है:WebInvoke सकते हैं गुण बाइंडिंग विन्यास

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

वहाँ एक रास्ता है कॉन्फ़िगरेशन में सेवा बाइंडिंग के माध्यम से इस क्रमिकरण को नियंत्रित करने के लिए, क्योंकि यह इस सेवा को अलग-अलग अंतराल पर विभिन्न धारावाहिक प्रदान करने से सीमित करता है।

उत्तर

5

मेरे पास एक अलग समाधान है, जो @Marc Gravell के विपरीत छोर पर काम करता है: अनुबंध को डुप्लिकेट करने के बजाय, सेवा कार्यान्वयन से 2 अलग-अलग वर्ग प्राप्त करें। ये सिर्फ उपनाम हैं; वे जरूरी हैं क्योंकि WCF सक्रियण प्रणाली (कम से कम के रूप में आईआईएस पर) आप भिन्न URL में एक ही सेवा के प्रकार सक्रिय करने के लिए अनुमति नहीं दी जाएगी (मुझे यकीन है कि क्यों Gravell समाधान इस समस्या में पड़ नहीं था नहीं कर रहा हूँ - त्रुटि है कि मैं कर रहा हूँ हो रहा है "एक पंजीकरण पहले से ही यूआरआई के लिए मौजूद है ..." जब मैं एक ही साइट पर विभिन्न यूआरएल पर एक ही सेवा वर्ग को सक्रिय करने का प्रयास करता हूं)। ध्यान दें कि यह केवल एक समस्या है अगर आप चेचक और json एक साथ के साथ एक ही सेवा चलाना चाहते हैं। यदि आप चाहते हैं कि प्रतिक्रिया प्रारूप को नियंत्रित करना है, तो आपको इस कार्यवाही की आवश्यकता नहीं है।

मेरी समाधान के पीछे मुख्य अवधारणा है, एक ही सेवा के लिए 2 अलग यूआरआई का उपयोग करने के लिए डिफ़ॉल्ट रूप आउटबाउंड प्रतिक्रिया स्वरूप निर्धारित करने के लिए कि समाप्ति बिंदु व्यवहार का उपयोग करें। तुम्हें पता है, this question में और अधिक जानकारी प्राप्त कर सकते हैं जो भी सवाल वैचारिक शुद्धता पर छू लेती है: हम अनुबंध विशेषताओं का उपयोग करना चाहिए गुण है कि नेटवर्क प्रोटोकॉल का हिस्सा हैं निर्दिष्ट करने के लिए? मुझे लगता है कि इस मुद्दे पर मार्क ग्रेवेल का मानना ​​वैध है, लेकिन यह डब्ल्यूसीएफ की मूल अवधारणा को संगत नहीं है, जिसमें अनुबंधों को प्रोटोकॉल स्टैक से दूर किया जाना चाहिए। लेकिन एंडपॉइंट व्यवहार आपको सभी आरईएसटी संबंधित विशेषताओं को निर्दिष्ट नहीं करने देंगे, आपको यूआरआई टेम्पलेट्स और इनबाउंड प्रारूप के लिए विशेषताओं का उपयोग करना होगा।

बाकी अलग ढंग से लागू किया गया है सकते हैं? हालांकि डब्ल्यूसीएफ के डिजाइनरों ने एक सामान्य ढांचे को डिजाइन करने का उत्कृष्ट काम किया है, मुझे नहीं लगता कि उन्होंने आरईएसटी को देखा है। यूआरआई टेम्पलेट की तरह कुछ चीजें वास्तव में अनुबंध से संबंधित प्रतीत होती हैं।

बस बात! कोड यहाँ है। सबसे पहले web.config फ़ाइल। यहां जादू पैदा होता है। ध्यान दें कि मैं इस उदाहरण में डब्ल्यूसीएफ 4 कॉन्फ़िगरेशन आधारित सक्रियण का उपयोग कर रहा हूं, लेकिन आप 2 यूआरआई का प्रतिनिधित्व करने के लिए 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 अनुबंधों को सिंक में रखने की आवश्यकता नहीं है।

+0

शानदार जवाब! –

संबंधित मुद्दे