Ошибка привязки mex в WCF
Я использую VSTS 2008 + С# +.NET 3.0. Я использую самообслуживаемую службу WCF. При выполнении следующего оператора появляется следующая ошибка "привязка не найдена". Я опубликовал весь файл app.config, любые идеи, что не так?
ServiceHost host = new ServiceHost(typeof(MyWCFService));
Сообщение об ошибке:
Не удалось найти базовый адрес, соответствующий схеме http для конечная точка с привязкой MetadataExchangeHttpBinding. Зарегистрированная база адресные схемы: [https].
Полный файл app.config:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="MyBinding"
closeTimeout="00:00:10"
openTimeout="00:00:20"
receiveTimeout="00:00:30"
sendTimeout="00:00:40"
bypassProxyOnLocal="false"
transactionFlow="false"
hostNameComparisonMode="WeakWildcard"
maxReceivedMessageSize="100000000"
messageEncoding="Mtom"
proxyAddress="http://foo/bar"
textEncoding="utf-16"
useDefaultWebProxy="false">
<reliableSession ordered="false"
inactivityTimeout="00:02:00"
enabled="true" />
<security mode="Transport">
<transport clientCredentialType="Digest"
proxyCredentialType="None"
realm="someRealm" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="MyWCFService"
behaviorConfiguration="mexServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="https://localhost:9090/MyService"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="MyBinding" contract="IMyService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mexServiceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
Ответы
Ответ 1
Базовый адрес для вашей службы определяет "HTTPS://" - но ваш mex-адрес - "HTTP".
Если вы хотите, чтобы ваша служба использовала https://, вам нужно использовать mexHttpsBinding:
<services>
<service name="MyWCFService" behaviorConfiguration="mexServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="https://localhost:9090/MyService"/>
</baseAddresses>
</host>
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="MyBinding"
contract="IMyService"
/>
<endpoint address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange"
/>
</service>
</services>
Марк
Ответ 2
Могу ли я пойти на двойной счет?:)
Поскольку вы используете WS-Http, вы привязываетесь к протоколу HTTPS, поэтому вам нужно использовать правильную привязку MEX;
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
Ответ 3
Я задал вопрос в комментарии для Marc_s answer
Возможно ли иметь IMetadataExchange для http и https как отдельные конечные точки?
marc_s ответил
вы должны определить второй базовый адрес для http://и используйте это для конечной точки http mex.
Таким образом, решение состоит в том, чтобы объявить несколько конечных точек с привязками SAME address = "mex" и different, такими как следующие
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
<endpoint contract="IMetadataExchange" binding="mexHttpsBinding" address="mex"/>
Недавно я обнаружил, что проще иметь один переключатель конфигурации, который можно использовать для включения MEX при тестировании и отключения Live.
От http://msdn.microsoft.com/en-us/library/aa395224.aspx
Можно использовать класс ServiceHostFactory для создания пользовательского полученное из ServiceHost в информационных службах Интернета (IIS custom ServiceHost, который добавляет ServiceMetadataBehavior, (который позволяет публиковать метаданные), даже если это поведение явно не указано добавлен в конфигурационный файл служб.
Напишите императивный код, который позволяет публикации метаданных один раз и затем повторно используйте этот код для нескольких разных служб. Это достигается путем создания нового класса, который происходит из ServiceHost и переопределяет метод ApplyConfiguration(), чтобы поведение публикации метаданных.
Пример кода из Статья MSDN для специализированного поставщика услуг
//Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
if (baseAddress.Scheme == Uri.UriSchemeHttp)
{
mexBehavior.HttpGetEnabled = true;
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeHttps)
{
mexBehavior.HttpsGetEnabled = true;
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpsBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
{
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexNamedPipeBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
{
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexTcpBinding(),
"mex");
}
}