在同一 WCF 绑定中同时使用 HTTP 和 HTTPS - 在代码中将 <security mode="Transport"> 更改为 <security mo

Posted

技术标签:

【中文标题】在同一 WCF 绑定中同时使用 HTTP 和 HTTPS - 在代码中将 <security mode="Transport"> 更改为 <security mode="TransportCredentialOnly">【英文标题】:Using Both HTTP and HTTPS in same WCF Binding - Changing <security mode="Transport"> to <security mode="TransportCredentialOnly"> In Code 【发布时间】:2021-09-17 07:22:59 【问题描述】:

我有一个从 Visual Studio 项目中的 WSDL 文件自动生成的绑定,如下所示:

<binding name="XServiceSoap" 
         maxBufferPoolSize="16777216"
         maxBufferSize="16777216" 
         maxReceivedMessageSize="16777216">
    <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm" 
                   proxyCredentialType="None"/>
    </security>
</binding>

客户端看起来像这样:

<endpoint address="http://uri/XService.asmx"
          binding="basicHttpBinding" 
          bindingConfiguration="XServiceSoap"
          contract="XService.XServiceSoap" 
          name="XServiceSoap"/>

在代码中,我可以使用

轻松更改端点地址(和凭据)
using WPFApp.XService;
var xServiceSoapClient = new XServiceSoapClient("XServiceSoap");
xServiceSoapClient.Endpoint.Address = new EndpointAddress(NEW_ENDPOINT);
xServiceSoapClient
    .ClientCredentials.Windows.ClientCredential.UserName = NEW_USERNAME;
xServiceSoapClient
    .ClientCredentials.Windows.ClientCredential.Password = NEW_PASSWORD;

但是,如果我尝试使用非 http 端点,则会抛出异常 The provided URI scheme 'https' is invalid; expected 'http'.

这个错误对我来说很有意义(例如from here),但是当我更改端点(测试与生产服务器)时,我希望相同的绑定同时支持 HTTP 和 HTTPS。如何使用内置的肥皂客户端在代码中执行此操作?我在xServiceSoapClient 中没有看到更改security mode 的选项,例如。我没有看到可以更改的 XServiceSoapclient.Security.Mode 选项。

我可以确认,当我手动将 app.config 从 TransportCredentialOnly 更改为 Transport 时,https 连接正常工作而不会引发异常。

谢谢!

【问题讨论】:

可以参考:***.com/questions/2435823/… 【参考方案1】:

WCF 客户端的构造函数有一个重载,它接受两个参数,bindingendpoint

你可以使用这个重载来传递你想要的安全模式:

WSHttpBinding binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;

var xServiceSoapClient = new xServiceSoapClient(binding, "XServiceSoap");

这是一般的想法,使用指定对象而不是服务客户端对象,这不适用于上述类型的操作。

【讨论】:

想说这正是我所需要的,虽然我使用了basicHttpBinding 而不是WSHttpBinding,因为存在一些兼容性问题。

以上是关于在同一 WCF 绑定中同时使用 HTTP 和 HTTPS - 在代码中将 <security mode="Transport"> 更改为 <security mo的主要内容,如果未能解决你的问题,请参考以下文章

关于WCF中协议使用的场景

在同一 Service Fabric 可靠服务中同时使用 WCF 服务和 Web Api

WCF 3.5 服务和多个 http 绑定

WCF 异常:找不到与端点的方案 http 匹配的基地址

.Net Core 中的 Http 绑定使用带有 wcf 引用的库项目

WCF 服务无法将大数组从 DAL 传送到 MVC