2010-04-05 7 views
8

मैं एक WCF-ओवर-टीसीपी काम कर सेवा पाने के लिए इच्छुक हूँ। मुझे अपनी परियोजना को संशोधित करने में कुछ समस्याएं आईं, इसलिए मैंने सोचा कि मैं वीएस -2008 में शामिल "बेस" डब्ल्यूसीएफ टेम्पलेट से शुरू करूंगा।mexTcpBinding - IMetadataExchange त्रुटियों

यहाँ प्रारंभिक WCF App.config है और WCF टेस्ट क्लाइंट ठीक इसके साथ काम कर सकते हैं जब मैं सेवा चलाने:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" /> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfTcpTest.Service1Behavior"> 
        <serviceMetadata httpGetEnabled="True"/> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

यह सब पर पूरी तरह से काम करता है, कोई समस्या नहीं।

मैं HTTP से टीसीपी के लिए इसे बदलने लगा तुच्छ होगा: उनके टीसीपी समकक्ष बाइंडिंग बदल सकते हैं और httpGetEnabled serviceMetadata तत्व निकाल:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.web> 
     <compilation debug="true" /> 
    </system.web> 
    <system.serviceModel> 
     <services> 
      <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:1337/Service1/" /> 
        </baseAddresses> 
       </host> 
       <endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1"> 
        <identity> 
         <dns value="localhost"/> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="WcfTcpTest.Service1Behavior"> 
        <serviceDebug includeExceptionDetailInFaults="True" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

लेकिन मैं WCF सेवा में इस त्रुटि मिलती है जब मैं इस चलाने होस्ट:

सिस्टम। अविश्वसनीय अपवाद अपवाद: अनुबंध सेवा 'IMetadataExchange' सेवा सेवा 1 द्वारा लागू अनुबंधों की सूची में नहीं पाया जा सका। इस अनुबंध के लिए समर्थन सक्षम करने के लिए सीधे कॉन्फ़िगरेशन फ़ाइल या ServiceHost पर ServiceMetadataBehavior जोड़ें।

मैं लग रहा है कि आप टीसीपी का उपयोग कर मेटाडाटा नहीं भेज सकते हैं मिलता है, लेकिन यह बात है क्यों वहाँ एक mexTcpBinding विकल्प है?

उत्तर

20

ठीक है, अगर तुम मेटाडाटा करना चाहते हैं - टीसीपी या HTTP - आप अभी भी serviceMetadata व्यवहार शामिल करने के लिए की जरूरत है!

<behaviors> 
    <serviceBehaviors> 
     <behavior name="WcfTcpTest.Service1Behavior"> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
      <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
</behaviors> 

ज़रूर, आप एक "HttpGetEnabled" इस पर नहीं हो सकता है - लेकिन व्यवहार में ही आदेश मेटाडाटा (और इस प्रकार IMetadataExchange अनुबंध) के आदान-प्रदान को सक्षम करने में मौजूद होना चाहिए।

+0

धन्यवाद! उसने ऐसा किया मुझे नहीं लगता कि WCF के विन्यास सही और फिर डिजाइन किया गया था है। App.config एक कॉन्फ़िगरेशन फ़ाइल है, मुझे लगता है कि जब एक कॉन्फ़िगरेशन तत्व हटा दिया गया था तो इसका अर्थ यह है कि "मैं स्पष्ट रूप से कोई कॉन्फ़िगरेशन सेट नहीं करता" नहीं "इस सुविधा को अक्षम करें"। एक बेहतर तरीका यह होगा: Dai

+1

@ दाऊद: ठीक है, वह एक विकल्प एक लंबे समय के लिए के बारे में बहस कर सकते है। डब्ल्यूसीएफ सिर्फ "अगर यह नहीं है, यह सक्रिय नहीं है" दृष्टिकोण का उपयोग करता है। एक बार जब आप इसे जानते हैं, तो यह ठीक है और बहुत समझ में आता है (आपको इसे वहां रखना नहीं है और इसे अक्षम करने के लिए सक्रिय = झूठा सेट करना है - बस इसे छोड़ दें) –

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