使用 wsHttpBinding 配置 WCF 服务
Posted
技术标签:
【中文标题】使用 wsHttpBinding 配置 WCF 服务【英文标题】:Configuration of WCF Service using wsHttpBinding 【发布时间】:2018-10-08 02:41:51 【问题描述】:我在使用 wsHttpBinding
和 Https 基地址设置 WCF 服务时遇到问题。
真正的问题是在客户端测试 WCF 中定义 mex 时:
错误:无法从 https://localhost:8722/Design_Time_Addresses/_20180420_WcfServiceLibraryTest/Service1/mex 如果这是您有权访问的 Windows (R) Communication Foundation 服务,请检查您是否已在指定地址启用元数据发布。 有关启用元数据发布的帮助,请参阅位于 http://go.microsoft.com/fwlink/?LinkId=65455 的 MSDN 文档。
App.config:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="NewBehavior0"> <!-- Error: Cannot optain metadata -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
<behavior name="NewBehavior1"> <!-- Error: Cannot Find Cert -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="BadThumbprint" x509FindType="FindByThumbprint" storeLocation="LocalMachine" storeName="My"/>
</serviceCredentials>
</behavior>
<behavior name="NewBehavior2"> <!-- Error: Cannot optain metadata -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceCredentials>
<serviceCertificate findValue="GoodThumbprint" x509FindType="FindByThumbprint" storeLocation="LocalMachine" storeName="My"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="wsHTTPBindingConf">
<security mode="Transport">
<!--<message clientCredentialType="None" />-->
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="NewBehavior0" name="_20180420_WcfServiceLibraryTest.Service1">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHTTPBindingConf"
name="WCFEndpoint" contract="_20180420_WcfServiceLibraryTest.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" bindingConfiguration=""
name="mexEndPoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="https://localhost:8722/Design_Time_Addresses/_20180420_WcfServiceLibraryTest/Service1/" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
阅读 SO 并尝试我发现的所有东西,我尝试了很多配置。但没有一个显示出值得一提的进展。而且看起来更像,我不知道。 使用 wsHttpBinding 使最基本的 Ws 工作(在 SoapUi 中编译 + 可测试)的正确配置是什么?
【问题讨论】:
无 Https 绑定因基于 https 的地址而失败。每个 Https 绑定都会被拒绝。 您尝试WCF Service Configuration Editor
(来自Tools
菜单)还是右键单击App.config
文件并选择Edit WCF Configuration
?
你的本地机器上有证书吗?
@Tim,是的,尝试使用真实证书和来自内部 PKI 的证书。
@HemidAbbasov,起初我使用工具界面阅读文档并尝试自己制作。老实说,这是第 6 个尝试从头开始创建的项目。
【参考方案1】:
我认为这可能是因为 mex bindingConfiguration=""
设置为空字符串?
尝试删除它,或将其设置为绑定。
如果默认的mexHttpBinding
不起作用,请尝试将其更改为wsHttpBinding
。这是一个示例Custom Secure Metadata Endpoint,可能会有所帮助。它说:
在许多其他示例中,元数据端点使用默认的
mexHttpBinding
,这是不安全的。这里元数据使用带有消息安全性的WSHttpBinding
进行保护。为了让元数据客户端检索此元数据,它们必须配置有匹配的绑定。
需要为不同的绑定配置 WCF 测试客户端,但我认为它会自动配置自己。
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService"
behaviorConfiguration="CalculatorServiceBehavior">
<!-- use base address provided by host -->
<endpoint address=""
binding="wsHttpBinding"
bindingConfiguration="Binding2"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<endpoint address="mex"
binding="wsHttpBinding"
bindingConfiguration="Binding1"
contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="Binding1">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
<binding name="Binding2">
<reliableSession inactivityTimeout="00:01:00" enabled="true" />
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
【讨论】:
【参考方案2】:mex 端点错误。这就是问题的原因。以下链接包含有关相同内容的完整详细信息。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-a-configuration-file
【讨论】:
您在这里提供的信息并不多。怎么了 ?文档的第 7 点说mexHttpsBinding
是有效的。其他属性有效。不是那个例子显示http不是https。如果您删除绑定和地址中的 s 以使它们成为 http 它可以工作。当 http 切换到 https 时,会在不包含 https 链接的地址上抛出错误。添加 https 链接时。一切都死了。
@xdtTransform 实际上我的措辞是错误的,我的意思是“mex 端点可能是问题的原因”,但我写的是问题的原因。我从来没有足够的时间去经历它。我在 *** 上还有一个解决类似问题的链接,请浏览一遍。 “***.com/questions/10192824/…”。不确定这是否有帮助,但只是想提供帮助。我在最后期限...所以真的可以通过这个问题。以上是关于使用 wsHttpBinding 配置 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
尝试将 gSoap 与 WCF 和 WSHttpBinding 一起使用
WCF 默认绑定设置的文档(例如 wsHttpBinding)
您可以使用 SOAP 和 WSHttpBinding 对 WCF 服务进行 jQuery 调用吗?