我创建了一个HTTP wcf服务,该服务将由Windows客户端使用并使用。在使用HTTP之前我没有任何问题。现在我的客户想要将网站更改为HTTPS。因此,出于开发目的,我使用了IIS express证书并设置了服务。现在,我的服务已在IIS中使用iisexpress自签名证书启动并运行。我可以通过浏览器以及wcf测试客户端工具浏览我的新https服务。
但是当我尝试从我的Windows应用程序调用该方法到新的https wcf服务时。我的服务实例已创建,但仅在调用方法时出现以下错误:
System.ServiceModel.ActionNotSupportedException未被用户代码处理 的HResult = -2146233087 消息=包含操作' http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence'的消息由于EndpointDispatcher上的ContractFilter不匹配,无法在接收方处理。这可能是由于合同不匹配(发送方与接收方之间的操作不匹配)或发送方与接收方之间的绑定/安全性不匹配。检查发件人和收件人是否具有相同的合同和相同的约束(包括安全要求,例如邮件,传输,无)。
在服务中我的绑定配置(在https模式下使用配置3,在http模式下使用配置2)如下:
<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自签名证书已在我的系统上安装并可用。服务和客户端都在同一系统中运行,因为它是开发
我怀疑我遇到了配置问题......但由于经验不足,我无法理解。
答案 0 :(得分:0)
实际上,它是服务实例化期间导致问题的附加绑定。通过在实例化部分中的下面的注释进行排序。
url = "https://localhost:550/TestService/TestService.svc";
customBinding = new CustomBinding();
//customBinding.Elements.Add(new ReliableSessionBindingElement());
customBinding.Elements.Add(new HttpsTransportBindingElement());
这有助于我继续开发整个服务和客户端。 因此,我总结了上述问题。
因为我是wcf服务的新手,所以我面临以下问题,面对并解决了。如果你遇到我的错误,像我这样挣扎的人可以使用下面的步骤
接下来我的服务在访问文件夹时遇到问题 修复:使用具有足够权限的服务或管理员帐户添加单独的应用程序池。
将wcf会话添加到现有代码。 修复:这是我面临问题的地方,因为我使用wshttpbinding与传输安全性。然后在浏览了几个材料和代码后,我必须使用visiblesession和httpstransport进行自定义绑定以进一步开发。所以我的配置大致显示为
<customBinding abc of wcf>
<reliableSession/>
<httpsTransport/>
<\customBinding>
并且在理解其真实目的之后还在上面的服务实例化中取消注释。不需要可靠会话标记中的任何值和httpsTransport以获得对安全性的基本支持。
这解决了我的第二个问题。