ASP.NET Core 3.1/5.0调用带Basic认证的HTTP SOAP服务报错求助
解决方案
你遇到的两个异常的根因如下:
- 首次
MessageSecurityException:WCF客户端默认未开启Basic认证配置,请求未携带认证头被服务端拦截 - 二次
ArgumentException:你将绑定安全模式设置为BasicHttpSecurityMode.Transport,该模式强制要求HTTPS协议,与你使用的HTTP协议不匹配
正确配置步骤
方案1:调用端手动配置(推荐,不会被服务引用更新覆盖)
不要修改自动生成的服务引用代码,直接在实例化客户端的业务代码中调整配置即可:
MyService.UpdateReq invoiceInfo = new MyService.UpdateReq(); MyService.JRPClient updateREQ = new MyService.JRPClient(); // 关键配置:将安全模式改为TransportCredentialOnly,适配HTTP协议下的Basic认证 var binding = (BasicHttpBinding)updateREQ.Endpoint.Binding; binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; // 配置认证凭证 updateREQ.ClientCredentials.UserName.UserName = "username"; updateREQ.ClientCredentials.UserName.Password = "pwd"; // 发起请求 MyService.ResponseType response = updateREQ.UpdateReq(invoiceInfo);
方案2:修改自动生成的绑定方法(不推荐,更新服务引用会被覆盖)
如果要修改自动生成的GetBindingForEndpoint方法,调整安全模式即可:
private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration) { System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding(); // 替换原Transport配置为TransportCredentialOnly result.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; result.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; // 无代理认证需求不需要配置ProxyCredentialType return result; }
注意事项
BasicHttpSecurityMode.TransportCredentialOnly是WCF专为HTTP协议下使用传输层认证(Basic/Digest等)提供的模式,不会强制要求HTTPS,完全适配你的场景- Basic认证本身为明文传输凭证,生产环境建议尽量升级为HTTPS协议,使用
Transport模式保证传输安全 - 无代理认证需求时不需要配置
ProxyCredentialType,保留默认值即可
内容的提问来源于stack exchange,提问作者oxygen
相关产品推荐
相关产品推荐

