2011-03-07 13 views
16

नहीं ढूंढ सकता है मैं सिर्फ डब्ल्यूसीएफ सीख रहा हूं और वर्तमान में इसे अभी तक प्राप्त कर रहा हूं।डब्ल्यूसीएफ सेवा होस्ट किसी भी सेवा मेटाडाटा

सीएस फ़ाइल:

WCF service host cannot find any service metadata...

किसी भी विचार यह क्या हो सकता है:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace wcfLib 
{    
    [ServiceContract] 
    public interface IfaceService 
    { 
     [OperationContract] 
     int wordLen(string word); 
    } 

    public class StockService : IfaceService 
    { 
     public int wordLen(string word) 
     { 
      return word.Length; 
     } 
    } 
} 

फिर भी जब मैं इसे चलाने के लिए कोशिश कर रहा हूँ, यह एक त्रुटि पॉप?

कॉन्फ़िग फ़ाइल:

<system.serviceModel> 
    <services> 
     <service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1"> 
     <endpoint address="" binding="wsHttpBinding" contract="wcfLib.ser"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8732/Design_Time_Addresses/wcfLib/Service1/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="wcfLib.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+5

आप हमें अपनी ** config ** फाइल दिखाने की जरूरत है! मेटाडेटा एक्सचेंज की तरह सामग्री को कॉन्फ़िगर –

+0

में परिभाषित किया गया है और आप अपना मेटाडेटा प्राप्त करने के लिए किस यूआरएल से कनेक्ट करने का प्रयास करते हैं ?? आप इस सेवा को कैसे होस्ट कर रहे हैं - आईआईएस या स्वयं-होस्टिंग ?? –

+2

Yoru कोड और कॉन्फ़िगरेशन मेल नहीं खाता - कोड में आपकी सेवा 'wcfLib.StockService' है लेकिन आपके टैग में 'name = wcfLib.Service1' है - उन नामों से मिलान करने की आवश्यकता है! एंड्रॉइंट पर 'अनुबंध = "wcfLib.ser" विशेषता के साथ ही - नामस्थान + इंटरफ़ेस नाम से मिलान करने की आवश्यकता है! ('wcfLib.IfaceService') –

उत्तर

23

में आप अपने कॉन्फ़िग फ़ाइल में निम्न होना चाहिए:

1) एक सेवा मेटाडाटा के लिए व्यवहार:

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

2) कि संदर्भ आपकी सेवा config में सेवा व्यवहार

<service name="wcfLib.StockService" 
     behaviorConfiguration="Metadata"> 
    .... 
</service> 

* कॉन्फ़िगरेशन फ़ाइल में सेवा टैग में नाम मान का नाम उसी भौतिक वर्ग के समान होना चाहिए जो अनुबंध लागू कर रहा है। याद रखें कि कक्षा का नाम बदलता है, तो इस मान को मिलान करने के लिए सुनिश्चित करें।

3) जगह में MEX (मेटाडाटा विनिमय)

<service name="wcfLib.StockService" 
     behaviorConfiguration="Metadata"> 
    .... 

    <endpoint name="mex" 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
</service> 
यह सब के साथ

के लिए एक अंत बिंदु, चीजों को ठीक होना चाहिए! :-)

+0

धन्यवाद! :) काम करता है! – Rob

+3

मेरे पास उपर्युक्त पोस्ट में आपने जो कुछ भी बताया है, वही है, मुझे अभी भी एक ही त्रुटि (संवाद बॉक्स) मिलती है। –

0

डिफ़ॉल्ट रूप से, दृश्य स्टूडियो सेटअप एक ग्राहक के लिए प्रयास करने के लिए जा रहा है/अपनी नई सेवा के साथ खिलौने के लिए परीक्षण ui। ऐसा करने के लिए इसे आपकी सेवा की संरचना और विधियों के बारे में जागरूक करने की आवश्यकता है। यह मानक डब्ल्यूएसडीएल प्रारूप में परिभाषा का उपभोग करके हासिल किया जाता है। हालांकि, डब्ल्यूसीएफ डिफ़ॉल्ट रूप से इस डेटा को प्रकाशित नहीं करेगा।

आपको एक मेटाडाटाएक्सचेंज एंडपॉइंट व्यवहार को एसीविव में सेट करना होगा।

या तो यहाँ कॉन्फ़िग फ़ाइल पोस्ट करें और हम सहायता कर सकते हैं, या गूगल metadataexchange और wsdl के लिए/ढेर खोज WCF

0

मुझे यह त्रुटि मिली क्योंकि मेरा सेवा नाम गलत था। HttpGetEnabled = False के साथ netTcp बाइंडिंग और mexTcp बाइंडिंग का उपयोग करके फिर काम किया।

0
// get the <system.serviceModel>/<services> config section 
ServicesSection services = ConfigurationManager.GetSection("system.serviceModel/services") as ServicesSection; 

ServiceHost host = new ServiceHost(typeof(SelfHostedService.Service)); 

// enumerate over each <service> node 
foreach (ServiceElement aService in services.Services) 
{ 
    Console.WriteLine(); 
    Console.WriteLine("Name: {0}/Behavior: {1}", aService.Name, aService.BehaviorConfiguration); 

    // enumerate over all endpoints for that service 
    foreach (ServiceEndpointElement see in aService.Endpoints) 
    { 
     Console.WriteLine("\tEndpoint: Address = {0}/Binding = {1}/Contract = {2}", see.Address, see.Binding, see.Contract); 
     //host.AddServiceEndpoint(
    } 
} 

try 
{ 
    Console.WriteLine("Service EndPoints are: "); 
    foreach (ServiceEndpoint endpoint in host.Description.Endpoints) 
    { 
     Console.WriteLine("{0} ({1})", endpoint.Address.ToString(), endpoint.Binding.Name); 
    } 
    host.Open(); 

    Console.WriteLine(string.Concat("Service is host at ", DateTime.Now.ToString())); 
    Console.WriteLine("\n Self Host is running... Press <Enter> key to stop"); 
} 
catch(Exception ex) 
{ 
    Console.WriteLine(ex.Message.ToString()); 
} 

यदि अभी भी काम नहीं करते हैं तो वर्तमान कॉन्फ़िगरेशन फ़ाइल को हटाएं और इसे अपने डिफ़ॉल्ट नाम App.config के साथ दोबारा बनाएं, यह काम करता है।

15

मुझे यह वही समस्या मिली और मेरे कॉन्फ़िगरेशन और सब कुछ मेटाडाटा एंडपॉइंट्स आदि के साथ इनलाइन था।यह पंक्ति:

<service behaviorConfiguration="wcfLib.Service1Behavior" name="wcfLib.Service1"> 

name मूल्य चाहिए, शारीरिक वर्ग है कि अनुबंध लागू कर रहा है के नाम होना चाहिए। मैं भूल गया ... एक बार फिर और मनमाने ढंग से इसका नाम यह सोच रहा था कि यह कोई स्ट्रिंग हो सकता है। तो कार्यान्वयन वर्ग के ऊपर मामले में Service1 नाम दिया जाना चाहिए। यदि वर्ग का नाम बदलता है, तो इस मान को बदलना सुनिश्चित करें।

यह डब्ल्यूसीएफ 101 सामान की तरह है और मैं अभी भी इसे जला देता हूं भले ही मैं फ्रेमवर्क 3.0 में सीटीपी के बाद डब्ल्यूसीएफ कर रहा हूं। ब्ला ...

+0

मैं इस बारे में भूल गया जब एक ट्यूटोरियल का पालन किया जो सेवा इंटरफेस और कक्षा के नाम बदल गया। नाम बदलने के लिए कोड रिफैक्टरिंग का उपयोग करना इससे बचा होगा। – jingtao

+0

धन्यवाद, यह बहुत उपयोगी था :) – TeaLeave

0

यदि आप अपना सेवा होस्ट प्रोग्रामेटिक रूप से बना रहे हैं और इंटरफ़ेस अनुबंध में [ServiceContract] और [OperationContract] विशेषताओं को जोड़ना भूल जाते हैं तो आप भी यही त्रुटि प्राप्त कर सकते हैं।

1

इस समस्या को बनाने का सबसे आसान तरीका है बस अपने इंटरफ़ेस नाम को फिर से कारक बनाना। यह निश्चित रूप से आपके प्रोजेक्ट में इंस्टेंस नाम बदलता है लेकिन यह web.config फ़ाइल को अपडेट करने में विफल रहता है। एक नई सेवा बनाने के लिए पुन: बनाने के लिए, अपने इंटरफ़ेस का नाम बदलें और F5, बूम, मेटाडेटा संवाद प्रकट होता है :-) उत्तर ऊपर जैसा है, बस अपनी web.config फ़ाइल को मैन्युअल रूप से बदलने के लिए याद रखें।

सादर

0

मैं इस एक पुराने सवाल है, लेकिन मैंने सोचा कि मैं इस विषय पर मेरी 2 सेंट दे चाहते हैं के बाद से यह सिर्फ मुझे क्या हुआ।

मैंने किसी भी तरह से वेब सेवा के लिए "कोई भी CPU" से "x86" से मेरा बिल्ड प्लेटफ़ॉर्म बदल दिया। दूसरा मैंने इसे "किसी भी सीपीयू" में बदल दिया, इसने समस्या को हल किया।

-1

मेरे पास HTTP सक्रियण चालू था। सुनिश्चित करें कि आपके पास यह है।

Ensure HTTP Activation is on

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