我创建了一个 HTTP wcf 服务,它将被 Windows 客户端使用并使用。在我使用 HTTP 之前,我没有任何问题。现在我的客户想要将站点更改为 HTTPS。因此,出于开发目的,我使用了 IIS express 证书并设置了服务。现在,我的服务已使用 iisexpress 自签名证书在 IIS 中启动并运行。我可以通过浏览器以及 wcf 测试客户端工具浏览我的新 https 服务。
但是当我尝试从我的 Windows 应用程序调用该方法到新的 https wcf 服务时。我的服务实例已创建,但仅在调用方法期间出现以下错误:
System.ServiceModel.ActionNotSupportedException 未被用户代码处理 HResult=-2146233087 Message=带有 Action ' http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence ' 的消息无法在接收方处理,因为EndpointDispatcher 的 ContractFilter 不匹配。这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。
在服务中,我的绑定配置(配置 3 在 https 模式下使用,配置 2 在 http 模式下使用)如下:
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding_IPGPService">
<!--config test 1 - start -->
<!--<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>-->
<!--config test 1 - end -->
<!--config test 2 - start -->
<!--<security mode="None" />
<reliableSession enabled="true" />-->
<!--config test 2 - end -->
<!--config test 3 - start -->
<!--<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"/>
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>-->
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
<!--config test 3 - end -->
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="PGPService.PGPService">
<endpoint address="" binding="wsHttpBinding" contract="PGPService.IPGPService" bindingConfiguration="wsHttpBinding_IPGPService" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<!--<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<!--<serviceDebug includeExceptionDetailInFaults="false"/>-->
<!--test config - start-->
<serviceDebug includeExceptionDetailInFaults="True" />
<!--test config - end-->
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
在客户端,我们使用自定义绑定来创建服务实例。
url = "https://localhost:550/TestService/TestService.svc";
customBinding = new CustomBinding();
customBinding.Elements.Add(new ReliableSessionBindingElement());
customBinding.Elements.Add(new HttpsTransportBindingElement());
EndpointAddress endpointAdress = new EndpointAddress(url);
pgpServiceClientInstance = new PGPServiceClient(customBinding, endpointAdress);
pgpServiceClientInstance.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.Root,
X509FindType.FindByThumbprint,
"03815c894b62dcf2d17336ade2d9ca61ddb7f92c");
添加服务引用后,在我的 Windows 应用程序上生成的 app.config 如下:
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IPGPService">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:550/TestService/TestService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IPGPService"
contract="PGPServiceReference.IPGPService" name="WSHttpBinding_IPGPService" />
</client>
所以现在我可以看到我的服务实例正在成功创建。但是在调用方法时,我得到了上述错误。
在服务端移动到 https 之前和之后没有更改代码。它是相同的服务代码。它在 http 上完全可以正常工作,但在 https 上却被破坏了。
在使我的 wcf 服务为 https 后,我已经完全删除了服务引用并新添加了它。IIS express 自签名证书已安装并已在我的系统上可用。到目前为止,服务和客户端都在同一个系统中运行,因为它正在开发中
我怀疑我遇到了配置问题....但是经验较少,我无法弄清楚。