Хост службы 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>
Ответы
Ответ 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.
Привет
Ответ 4
Похоже, вам нужно добавить конечную точку обмена метаданными:
http://en.csharp-online.net/WCF_Essentials%E2%80%94Metadata_Exchange
Ответ 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]()