Подтвердить что ты не робот

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

Я просто изучаю 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>
4b9b3361

Ответ 1

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

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>

Со всем этим на месте все должно быть просто прекрасно!: -)

Ответ 2

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

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

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

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

Ответ 3

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

Привет

Ответ 5

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

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

Оставьте здесь свой файл конфигурации, и мы можем помочь, или поиск google/stack для metadataexchange и wsdl в WCF

Ответ 6

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

Ответ 7

// 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, это работает.

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

Ensure HTTP Activation is on