-1

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

我怀疑我遇到了配置问题....但是经验较少,我无法弄清楚。

4

1 回答 1

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。然后在浏览了几种材料和代码后,我必须使用可靠会话和 httpstransport 将我的配置设置为自定义绑定,以进一步进行开发。所以我的配置大致显示为

    <customBinding abc of wcf>
      <reliableSession/>
      <httpsTransport/>
    <\customBinding>
    

并且在了解了服务实例化的真正目的后,也取消了上面的注释。可靠会话标签和 httpsTransport 中不需要任何值来提供基本的安全支持。

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

  1. 但是我现在在 wcf 客户端测试工具中面临 wsdl 导入错误,我现在正在努力解决。svcutil 代理生成选项或使用未检查的程序集选项添加服务引用似乎不起作用。我还注意到,即使将我的服务重新添加到客户端,我的 app.config 文件中也没有生成任何配置,令人惊讶的是......上面提到的选项无济于事......寻找专家的想法......修复: ??? 探索....欢迎阅读本文的灵魂给出答案/建议。
于 2017-04-02T15:30:50.590 回答