Хост службы WCF не может найти метаданные службы - PullRequest
17 голосов
/ 07 марта 2011

Я только изучаю wcf и в настоящее время получил это далеко.

Файл CS:

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;
        }
    }
}

Тем не менее, когда я пытаюсь запустить его, появляется сообщение об ошибке:

Хост службы WCF не может найти метаданные службы ...

Есть идеи, что это может быть?

Файл конфигурации:

<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>

Ответы [ 10 ]

25 голосов
/ 07 марта 2011

В вашем конфигурационном файле должно быть следующее:

1) поведение службы для метаданных:

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

2) ссылка на это поведение службы вконфигурация вашей службы

<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>

При всем этом все должно бытьпросто хорошо!: -)

15 голосов
/ 31 октября 2012

У меня возникла точно такая же проблема, и я энергично проходил через мою конфигурацию, и все было встроено в конечные точки метаданных и т. Д. Проблема? Эта строка:

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

Значение name ДОЛЖНО, ДОЛЖНО иметь имя физического класса, реализующего контракт. Я забыл ... еще раз и произвольно назвал его, думая, что это может быть любая строка. Таким образом, в приведенном выше случае реализующий класс должен иметь имя Service1. Если имя класса меняется, обязательно измените это значение.

Это похоже на WCF 101, и я все еще сгораю от этого, несмотря на то, что я занимался WCF начиная с CTP в Framework 3.0. Мля ...

1 голос
/ 24 июня 2017

У меня была активирована активация HTTP.Убедитесь, что он включен.

Ensure HTTP Activation is on

1 голос
/ 17 ноября 2014

Самый простой способ создать эту проблему - просто поменять имя вашего интерфейса. Это, безусловно, меняет имя экземпляра в вашем проекте, но не может обновить файл web.config. Чтобы заново создать новую службу, переименуйте ваш интерфейс и нажмите F5, появится бум, откроется диалоговое окно метаданных :-).

Привет

0 голосов
/ 20 мая 2015

Я знаю, что это старый вопрос, но я решил дать 2 цента на эту тему, потому что это случилось со мной.

Я каким-то образом изменил свою платформу сборки с «Любой процессор» на «x86»для самого веб-сервиса.После того, как я изменил его обратно на «Любой процессор», он решил проблему.

0 голосов
/ 19 ноября 2013

Вы можете также получить эту же ошибку, если вы создаете хост службы программно и забыли добавить атрибуты [ServiceContract] и [OperationContract] в контракт интерфейса.

0 голосов
/ 22 февраля 2012
// 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, это работает.

0 голосов
/ 15 июля 2011

Я получил эту ошибку, потому что имя моей службы было неверным.Затем сработали netTcpBinding и mexTcpBinding с httpGetEnabled = False.

0 голосов
/ 07 марта 2011

По умолчанию Visual Studio попытается настроить клиентский / тестовый интерфейс, чтобы вы могли поиграть с новым сервисом. Для этого необходимо знать структуру и методы, предлагаемые вашим сервисом. Это достигается путем использования определения в стандартном формате WSDL. Однако WCF не будет публиковать эти данные по умолчанию.

Вы должны настроить поведение конечной точки обмена метаданными на acehive.

Либо опубликуйте ваш конфигурационный файл здесь, и мы поможем, либо поищите в Google / stack metadataexchange и wsdl в WCF

0 голосов
/ 07 марта 2011

Похоже, вам нужно добавить конечную точку обмена метаданными:

http://en.csharp -online.net / WCF_Essentials% E2% 80% 94Metadata_Exchange

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...