如何在ASP.NET Core 2.0中创建Binding?解决TransportWithMessageCredential异常
解决BasicHttpBinding设置TransportWithMessageCredential时的NotSupportedException
这个问题我之前帮不少开发者排查过,核心原因很直接:BasicHttpBinding根本不支持TransportWithMessageCredential这个安全模式——它的安全模式枚举里压根就没包含这个选项,所以你一设置就会触发NotSupportedException,报错里的System.ServiceModel.HttpBindingBase.CheckSettings()就是在验证配置合法性时抛出的异常。
先明确BasicHttpBinding支持的安全模式
BasicHttpSecurityMode枚举只有以下4个有效值:
None:完全不启用安全机制Transport:依赖传输层安全(比如HTTPS)来加密消息并验证凭据Message:使用SOAP消息层安全来加密和验证TransportCredentialOnly:仅在传输层传递凭据,但不加密消息(不建议在生产环境使用)
给你两个靠谱的解决方案
方案1:换成支持混合模式的WSHttpBinding
如果你确实需要「传输层加密+消息层凭据」的混合安全场景,直接换成WSHttpBinding就可以了,它原生支持TransportWithMessageCredential模式:
Binding CreateBinding() { // 直接用带安全模式参数的构造函数初始化 var binding = new WSHttpBinding(SecurityMode.TransportWithMessageCredential); // 根据需求配置消息层的凭据类型,比如UserName binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; return binding; }
方案2:调整为BasicHttpBinding支持的安全模式
如果你的场景不需要混合模式,根据实际需求选一个BasicHttpBinding支持的模式即可:
比如需要HTTPS加密+传输层凭据验证:
Binding CreateBinding() { var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); // 配置传输层的凭据类型,比如Basic、Windows等 binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; return binding; }
或者需要消息层安全:
Binding CreateBinding() { var binding = new BasicHttpBinding(BasicHttpSecurityMode.Message); binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName; return binding; }
补充小知识
BasicHttpBinding是为兼容旧版ASMX服务设计的,安全模型相对简单;而WSHttpBinding是基于WS-*标准的现代绑定,支持更复杂的安全、可靠会话等特性,所以如果有复杂安全需求,优先考虑WSHttpBinding或者CustomBinding。
内容的提问来源于stack exchange,提问作者PaulLeonH
相关产品推荐
相关产品推荐

