Я пытаюсь создать простой ConsoleApplication, в котором я хотел бы разместить простой wcf сервис.
Вот код для моего
namespace HostConsoleApplication
{
class Program
{
static void Main(string[] args)
{
using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FirstWcfService.Service)))
{
host.Open();
Console.WriteLine("Sai");
Console.ReadLine();
}
}
}
}
Затем я добавил app.config, который похож на это:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior">
<endpoint address="FirstWcfService" binding="netTcpBinding" contract="FirstWcfService.IService"/>
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:9101/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior" >
<serviceMetadata httpGetEnabled="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Когда я запускаю консольное приложение хоста, я получаю это исключение:
Система. InvalidOperationException был необработанным сообщением =, "Не удалось найти базовый адрес, который соответствует схеме http для конечной точки с привязкой MetadataExchangeHttpBinding. Зарегистрированные схемы базового адреса [net.tcp]".
Источник = "Система. ServiceModel"
StackTrace: в System. ServiceModel. ServiceHostBase. MakeAbsoluteUri (Uri relativeOrAbsoluteUri, Связывая привязку, UriSchemeKeyedCollection baseAddresses) в System. ServiceModel. Описание. ConfigLoader. LoadServiceDescription (хост ServiceHostBase, описание ServiceDescription, ServiceElement serviceElement, Действие '1 addBaseAddress) в System. ServiceModel. ServiceHostBase. LoadConfigurationSectionInternal (ConfigLoader configLoader, описание ServiceDescription, ServiceElement serviceSection) в System. ServiceModel. ServiceHostBase. LoadConfigurationSectionInternal (ConfigLoader configLoader, описание ServiceDescription, Строка configurationName) в System. ServiceModel. ServiceHostBase. ApplyConfiguration () в Системе. ServiceModel. ServiceHostBase. InitializeDescription (UriSchemeKeyedCollection baseAddresses) в System. ServiceModel. ServiceHost. InitializeDescription (Вводят serviceType, UriSchemeKeyedCollection baseAddresses) в System. ServiceModel. ServiceHost.. ctor (Вводят serviceType, Uri [] baseAddresses) в HostConsoleApplication. Программа. Основной (Строка [] args) в C:\Documents and Settings\navin.pathuru\My Documents\Visual Studio 2008\Projects\Solution2\HostConsoleApplication\Program.cs:line 13 в System. AppDomain. _ nExecuteAssembly (Блок блока, Строка [] args) в System. AppDomain. ExecuteAssembly (Представляют assemblyFile в виде строки, Доказательство assemblySecurity, Строка [] args) в Microsoft. VisualStudio. HostingProcess. HostProc. RunUsersAssembly () в Системе. Поточная обработка. ThreadHelper. ThreadStart_Context (Объектное состояние) в System. Поточная обработка. ExecutionContext. Выполненный (ExecutionContext executionContext, обратный вызов ContextCallback, Объектное состояние) в System. Поточная обработка. ThreadHelper. ThreadStart () InnerException:
Просто задавшись вопросом, если, как зафиксировать это. Спасибо N
Ну, я думаю, проблема в следующем:
В общем, если вы хотите использовать MEX через http, вам нужно предоставить либо полный адрес для конечной точки MEX, либо базовый адрес http (если вы указываете только относительный адрес).
Решение 1: указать полный адрес конечной точки MEX:
<services>
<service name="FirstWcfService.Service"
behaviorConfiguration="ServiceBehavior">
<endpoint
address="FirstWcfService"
binding="netTcpBinding"
contract="FirstWcfService.IService"/>
<endpoint
address="http://localhost:9102/FirstWcfService/mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
......
</service>
</services>
Решение 2: определить базовый адрес HTTP:
<services>
<service name="FirstWcfService.Service"
behaviorConfiguration="ServiceBehavior">
<endpoint
address="FirstWcfService"
binding="netTcpBinding"
contract="FirstWcfService.IService"/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:9101/"/>
<add baseAddress="http://localhost:9102/"/>
</baseAddresses>
</host>
</service>
</services>
Решение 3: использовать mexTcpBinding вместо
<services>
<service name="FirstWcfService.Service"
behaviorConfiguration="ServiceBehavior">
<endpoint
address="FirstWcfService"
binding="netTcpBinding"
contract="FirstWcfService.IService"/>
<endpoint
address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
......
</service>
</services>
Любой из этих трех вариантов должен решить проблему.
Слово предостережения: Я считаю довольно рискованным называть вашу конфигурацию поведения сервиса "ServiceBehavior"......
<serviceBehaviors>
<behavior name="ServiceBehavior" >
Моя рекомендация: называйте вашу первую конфигурацию по умолчанию просто "Default" (или "DefaultBehavior")
<serviceBehaviors>
<behavior name="Default" >
и начинайте давать другие имена, только если у вас несколько конфигураций.
Называя это ServiceBehavior
, вы просто напрашиваетесь на неприятности некоторое время спустя.....