WCF服务在从http更改为https"在EndpointDispatcher"处更改为不合格时,从客户端调用方法时返回错误

时间:2017-03-26 06:22:38

标签: c# .net wcf iis wcf-hosting

我创建了一个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自签名证书已在我的系统上安装并可用。服务和客户端都在同一系统中运行,因为它是开发

我怀疑我遇到了配置问题......但由于经验不足,我无法理解。

1 个答案:

答案 0 :(得分:0)

实际上,它是服务实例化期间导致问题的附加绑定。通过在实例化部分中的下面的注释进行排序。

 url = "https://localhost:550/TestService/TestService.svc";
                customBinding = new CustomBinding();
                //customBinding.Elements.Add(new ReliableSessionBindingElement());
                customBinding.Elements.Add(new HttpsTransportBindingElement());

这有助于我继续开发整个服务和客户端。 因此,我总结了上述问题。

因为我是wcf服务的新手,所以我面临以下问题,面对并解决了。如果你遇到我的错误,像我这样挣扎的人可以使用下面的步骤

  1. 接下来我的服务在访问文件夹时遇到问题 修复:使用具有足够权限的服务或管理员帐户添加单独的应用程序池。

  2. 将wcf会话添加到现有代码。 修复:这是我面临问题的地方,因为我使用wshttpbinding与传输安全性。然后在浏览了几个材料和代码后,我必须使用visiblesession和httpstransport进行自定义绑定以进一步开发。所以我的配置大致显示为

    <customBinding abc of wcf>
      <reliableSession/>
      <httpsTransport/>
    <\customBinding>
    
  3. 并且在理解其真实目的之后还在上面的服务实例化中取消注释。不需要可靠会话标记中的任何值和httpsTransport以获得对安全性的基本支持。

    这解决了我的第二个问题。

    1. 但是我现在面对wcf客户端测试工具中的wsdl导入错误,我正在努力解决这个问题。 svcutil代理生成选项或添加服务引用与uncheked程序集选项似乎没有工作。另外我注意到,即使将我的服务参考新添加到客户端,也没有为我的app.config文件生成令人惊讶的配置.....并且上面提到的选项不帮助.....寻找专家的想法.... 修复:??? Expolring .... 欢迎阅读此内容的灵魂给予回答/建议。