在同一 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 客户端的构造函数有一个重载,它接受两个参数,binding
和 endpoint
你可以使用这个重载来传递你想要的安全模式:
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的主要内容,如果未能解决你的问题,请参考以下文章
在同一 Service Fabric 可靠服务中同时使用 WCF 服务和 Web Api