2011-08-11 9 views
11

मुझे एंडपॉइंट्स, व्यवहार इत्यादि के साथ डब्ल्यूसीएफ सेटअप से नफरत है। मुझे विश्वास है कि इन सभी चीजों को स्वचालित रूप से किया जाना चाहिए। मैं बस अपनी डब्ल्यूसीएफ सेवा से जेएसओएन परिणाम वापस करना चाहता हूं। यहाँ मेरी विन्यास है:डब्ल्यूसीएफ कॉन्फ़िगरेशन नरक?

<system.serviceModel> 
<bindings> 
    <webHttpBinding> 
    <binding name="default"/> 
    </webHttpBinding> 
</bindings> 
<services> 
    <service name="HighOnCodingWebApps.ZombieService" 
    behaviorConfiguration="MyServiceTypeBehaviors"> 
    <endpoint address="" binding="webHttpBinding" 
     bindingConfiguration="default" 
     contract="HighOnCodingWebApps.IZombieService" 
     behaviorConfiguration="webScriptEnablingBehavior"/> 
    </service> 
</services> 

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webScriptEnablingBehavior"> 
     <enableWebScript/> 
    </behavior> 
    </endpointBehaviors> 

    <serviceBehaviors> 
    <behavior name="MyServiceTypeBehaviors"> 
     <serviceMetadata httpGetEnabled="true"/> 


    </behavior> 
    </serviceBehaviors> 
</behaviors> 

<serviceHostingEnvironment aspNetCompatibilityEnabled="false"/> 

और मैं निम्न सेवा कार्यान्वयन है:

public class ZombieService : IZombieService 
    { 
     [WebInvoke(Method = "GET", 
        ResponseFormat = WebMessageFormat.Json, 
        UriTemplate = "KnownZombies")] 
     public Zombie GetZombie() 
     { 
      return new Zombie() { Name = "Mohammad Azam"}; 
     } 
    } 

    public class Zombie 
    { 
     public string Name { get; set; } 
    } 

जब मैं http://localhost:22059/ZombieService/KnownZombies निम्न संदेश का कहना है:

Endpoints का उपयोग कर 'UriTemplate' नहीं कर सकते 'System.ServiceModel.Description.WebScriptEnablingBehavior' के साथ प्रयोग किया जाए।

मैं web.config मैं निम्नलिखित त्रुटि मिलती से WebScriptEnablingBehavior निकालते हैं:

The message with To 'http://localhost:22059/ZombieService.svc/KnownZombies' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

अद्यतन 1:

मैं इस के लिए विन्यास अद्यतन:

<system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="default"/> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service name="HighOnCodingWebApps.ZombieService" 
     behaviorConfiguration="MyServiceTypeBehaviors"> 
     <endpoint address="http://localhost:22059/ZombieService.svc" binding="webHttpBinding" 
      bindingConfiguration="default" 
      contract="HighOnCodingWebApps.IZombieService" 
      /> 
     </service> 
    </services> 

    <behaviors> 
     <endpointBehaviors> 
     <behavior name="SomeBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceTypeBehaviors"> 

      <serviceMetadata httpGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    </system.serviceModel> 

अब जब मैं http://localhost:22059/ZombieService.svc/KnownZombies पर जाता हूं मुझे ब्राउज़र में निम्न संदेश मिलता है:

The message with To 'http://localhost:22059/ZombieService.svc/KnownZombies' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

+2

कुछ भी ऊपर खींच नहीं है? क्या आप कुछ सहायक पोस्ट करने का प्रयास कर सकते हैं, और शायद एक प्रश्न शामिल कर सकते हैं? –

+0

डब्ल्यूसीएफ 4.0 देखें - इसने ** ** कॉन्फ़िगरेशन सिरदर्द के बहुत सारे ** का उपचार किया है! व्यापक विवरण के लिए [एक डेवलपर का परिचय डब्ल्यूसीएफ 4] (http://msdn.microsoft.com/en-us/library/ee354381.aspx) पढ़ें। –

+0

अपडेट सवाल – azamsharp

उत्तर

5

this SO question पर एक नजर डालें।

संपादित करें: चूंकि आप अपनी सेवा के लिए कोई पता निर्दिष्ट नहीं कर रहे हैं, तो मारने का प्रयास करें: http://localhost:22059/ZombieService.svc/KnownZombies (.svc के साथ)।

मुझे यह भी लगता है कि आपको अपने निर्दिष्ट एंडपॉइंट व्यवहार में <webHttp /> व्यवहार जोड़ा गया है।

संपादित करें: इस के लिए अपने अंतिम बिंदु परिभाषा बदलने का प्रयास करें:

<service 
    name="HighOnCodingWebApps.ZombieService" 
    behaviorConfiguration="MyServiceTypeBehaviors"> 

    <endpoint 
    address="" 
    binding="webHttpBinding" 
    behaviorConfiguration="SomeBehavior" 
    bindingConfiguration="default" 
    contract="HighOnCodingWebApps.IZombieService" /> 

</service> 
+0

अद्यतन पोस्ट देखें! – azamsharp

+0

प्रवेश मारना मुझे मार रहा है ... मैं इसके बजाय अपना जवाब संपादित करूंगा। डाउनवोट को रद्द करने के लिए – BrandonZeider

10

क्या आपने डब्ल्यूसीएफ SvcConfigEditor की कोशिश की है? यह विजुअल स्टूडियो में टूल्स मेनू से उपलब्ध है। सब कुछ ठीक करने पर जीयूआई सहायता प्राप्त करने के लिए SvcConfigEditor के साथ अपना वेब/app.config खोलें।

1

आप WebInvokeAttribute का उपयोग कर रहे हैं जो डिफ़ॉल्ट रूप से पोस्ट को स्वीकार करने के लिए डब्लूसीएफ को बताता है। चूंकि आप इसे जीईटी एक्शन के माध्यम से एक्सेस करने का प्रयास कर रहे हैं, इसे अनदेखा किया जा रहा है।

इसके बजाय WebGetAttribute का उपयोग करें।

प्रति MSDN

:

If you want a service operation to respond to GET, use the WebGetAttribute instead.

+0

मैं निम्नलिखित [WebGet (ResponseFormat = WebMessageFormat.Json, UriTemplate = "KnownZombies")] सार्वजनिक ज़ोंबी GetZombie() करने के लिए इसे बदलकर { नई ज़ोंबी() {नाम = "मोहम्मद आजम" वापसी}; } लेकिन इसी परिणाम – azamsharp

1

मैं व्यक्तिगत रूप से विन्यास विकल्प है कि WCF प्रदान करता है (मैं ranted about it before है) के सभी पसंद नहीं है, और अपने मामले में तुम नहीं कॉन्फ़िगरेशन का उपयोग करने की आवश्यकता है। जेएसओएन वापस करने के लिए एक सरल सेवा के लिए, आप सेवा होस्ट फैक्टरी का उपयोग कर सकते हैं, और एक ऐसा है जो ठीक है (webHttpBinding/webHttp व्यवहार एंडपॉइंट सेट करें), System.ServiceModel.Activation.WebServiceHostFactory।आपके मामले में, आप कर सकते हैं:

  • config (वास्तव में, आप बिल्कुल config जरूरत नहीं है)
  • से निकालें सब कुछ कि कारखाने के संदर्भ के लिए अपने .svc फ़ाइल अपडेट करें (देखें नीचे)

यही है।

<%@ ServiceHost Language="C#" Service="HighOnCodingWebApps.ZombieService" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %> 

एक और बात:: यहाँ क्या .svc कैसा दिखना चाहिए मैंने देखा है कि अपने वर्ग [ServiceContract] के साथ सजाया नहीं है, लेकिन आप कक्षा में अपने विधि में एक [WebGet] विशेषता है। यदि इंटरफ़ेस (IZombieService) [ServiceContract] से सजाया गया है, तो इंटरफ़ेस में विधि [WebGet] से सजाए गए एक होना चाहिए। आप इंटरफ़ेस को पूरी तरह से बाईपास कर सकते हैं और '[ServiceContract] के साथ ज़ोंबी सेवा कक्षा को भी सजाने के लिए तैयार कर सकते हैं।

[ServiceContract] 
public class ZombieService 
{ 
    [WebGet(ResponseFormat = WebMessageFormat.Json, 
      UriTemplate = "KnownZombies")] 
    public Zombie GetZombie() 
    { 
     return new Zombie() { Name = "Mohammad Azam"}; 
    } 
} 

public class Zombie 
{ 
    public string Name { get; set; } 
} 
0

बस WCF

के बजाय
+0

+1। डब्लूसीएफ कुछ जेएसओएन सामग्री को HTTP अनुरोध पर लौटने के काम के लिए बेहद खराब फिट है, यदि आप उस उपकरण का उपयोग करते हैं जो वास्तव में कार्य के लिए अनुकूल है तो सब कुछ अधिक आसान होगा। – Carson63000

+4

हालांकि यह अच्छी सलाह हो सकती है, यह किसी प्रश्न का उत्तर नहीं है। जब आप एक उत्तर लिखते हैं तो थोड़ा पॉप अप विशेष रूप से राय के आधार पर बयान देने से बचने के लिए कहता है। – sanpaco

0

मैं .NET Framework 4, VS2010 का उपयोग कर रहा ASP.NET वेब एपीआई का उपयोग करें। मैंने अपने global.asax.cs में एक डमी गलती की है कि वेबस्वायरहोस्ट फैक्टरी का उदाहरण बनाने के बजाय मैंने वेबस्क्रिप्ट सेवा HostFactory को इंटेलसेन्स के माध्यम से पेंच किया। नतीजतन मुझे एक ही त्रुटि मिली:

'UriTemplate' का उपयोग करके एंडपॉइंट्स का उपयोग 'System.ServiceModel.Description.WebScriptEnablingBehavior' के साथ नहीं किया जा सकता है।

मैं WebServiceHostFactory मेरी global.asax.cs में करने के लिए उदाहरण के सही है, मैं त्रुटि अब और नहीं दिख रहा।

+0

वेबस्क्रिप्ट को सक्षम करने के लिए एक टैग है लेकिन इसे अक्षम करने के लिए नहीं, इसलिए आप उम्मीद करेंगे कि टैग जोड़ने से इसे अक्षम कर दिया जाएगा। लेकिन यह केवल जब मैं स्पष्ट टैग जोड़ा संकल्प लिया गया: <व्यवहार नाम = "poxBehavior"> Jos

0

अपने WebGet या WebInvoke निर्दिष्ट में अपने BodyStyleWrappedRequest, तो UriTemplate को हटा दें। जब आपकी सेवा का आह्वान करते हैं तो फ़ंक्शन का नाम उपयोग करें।

उम्मीद है कि यह मदद करता है।

उदाहरण:

[OperationContract] 
    [WebInvoke(Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    void register(string name, string surname); 
संबंधित मुद्दे