You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:33:31