WCF中的mex绑定错误
-
06-07-2019 - |
题
我使用的是VSTS 2008 + C#+ .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>
解决方案
您服务的基地址定义“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>
马克
其他提示
我可以获得双倍分数吗? :)
当您使用WS-Http时,您绑定到HTTPS协议,因此您需要使用正确的MEX绑定;
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
是否可以将http和https作为IMetadataExchange 单独的端点?
&NBSP; marc_s&NBSP;回答&NBSP;
你应该能够为http://和定义第二个基地址 将其用于http mex端点。
因此解决方案是使用SAME&nbsp; address =&quot; mex&quot;来声明多个端点。和不同的绑定,如下所示
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
<endpoint contract="IMetadataExchange" binding="mexHttpsBinding" address="mex"/>
最近我发现有一个配置开关更容易,可用于在测试时启用MEX并在Live上禁用。
来自&nbsp; http://msdn.microsoft.com/en-us /library/aa395224.aspx
可以使用&nbsp; ServiceHostFactory&nbsp;类来创建自定义 源自Internet信息服务中的ServiceHost (IIS&nbsp;自定义ServiceHost,添加ServiceMetadataBehavior,( 启用元数据发布),即使此行为未明确表示 添加在服务的配置文件中。
&nbsp;编写一次启用元数据发布的命令性代码 然后在几个不同的服务中重用该代码。这是 通过创建一个源自&nbsp; ServiceHost&nbsp;和。的新类来完成 覆盖&gt; 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");
}
}