我在 Windows Server 2008 上的 IIS 中托管了一个 .NET 4.0 WCF 服务,该服务在 HTTP 上运行得很好。WCF 服务正在被第三方使用,该第三方正在使用 Appian Process Modeler 来配置 WCF 客户端(不是说它是相关的,但我想我会提到它)。
编辑:所以他们使用 Appian Process Modeler 的事实可能实际上是相关的。它是一个基于 Java 的客户端,因此这意味着我们正在尝试让 Java 客户端使用基于 SSL 的 WS-Policy 来使用 .NET WCF 服务。
编辑#2:由于我现在知道 Java 正在使用 .NET 服务,这是我可以做的修复,以允许 Java 通过 SSL 使用我的服务,还是我的客户端可以实施修复以允许他们的 Java 代码使用 WS-Policy 来使用 .NET 服务?
从测试转移到我们的生产环境后,当我们的客户端更新其服务引用以指向新的生产 URL 时,他们收到以下错误:
端点 BasicHttpBinding_IInterface 包含对尚不支持的 WS-Policy 主题的引用。该端点不可选择。(APNX-2-4041-003)
在比较两个 WSDL 文档(非 SSL/测试、SSL/生产)时,我发现了以下两个差异,它们都与 WS-Policy 相关(这是 WSDL 文档中唯一的两个差异,除了 URL 之外):
<wsp:Policy wsu:Id="BasicHttpBinding_IInterface_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
和
<wsp:PolicyReference URI="#BasicHttpBinding_IInterface_policy"/>
我尝试在生产环境中创建一个静态 WSDL 文档,并删除了这两个部分,但如果这样做,我将无法生成与 WCF 服务的安全连接。
所以我的问题是,如何配置 WCF 在没有 WS-Policy 要求的情况下通过 SSL 响应?
这是我们在服务器上使用的配置:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttps">
<security mode="Transport">
<transport clientCredentialType="None" />
<message />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client />
<services>
<service name="Namespace.API.IInterface_Implementation">
<endpoint address=""
binding="basicHttpBinding"
bindingConfiguration="basicHttps"
contract="Namespace.API.Interfaces.IInterface"/>
<endpoint address="mex"
binding="mexHttpsBinding"
contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" 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"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>