如何在C#中为SOAP Service添加包含用户名密码的请求头
C# 向SOAP Web Service请求添加用户名密码Header的实现方案
以下是不同对接场景下的实现方式:
场景1:使用WCF服务引用(Service Reference)
如果是通过Visual Studio添加的WCF服务引用,可根据服务要求的验证规则选择对应方案:
- 普通自定义SOAP Header场景:
using (var client = new YourServiceClient()) using (var scope = new OperationContextScope(client.InnerChannel)) { // 构造自定义Header,第二个参数替换为服务提供方指定的命名空间 var usernameHeader = MessageHeader.CreateHeader("Username", "http://你的服务命名空间", "实际用户名"); var passwordHeader = MessageHeader.CreateHeader("Password", "http://你的服务命名空间", "实际密码"); OperationContext.Current.OutgoingMessageHeaders.Add(usernameHeader); OperationContext.Current.OutgoingMessageHeaders.Add(passwordHeader); // 调用服务方法 var result = client.YourServiceMethod(); }
- WS-Security标准用户名密码验证场景:
using (var client = new YourServiceClient()) { client.ClientCredentials.UserName.UserName = "实际用户名"; client.ClientCredentials.UserName.Password = "实际密码"; // 调用服务方法 var result = client.YourServiceMethod(); }
需同步在配置文件中调整绑定的安全配置:
<bindings> <basicHttpBinding> <binding name="YourServiceBinding"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName" /> </security> </binding> </basicHttpBinding> </bindings>
场景2:使用传统ASMX Web引用(Web Reference)
针对旧版ASMX服务引用,可通过继承自动生成的代理类,添加自定义Header:
- 首先定义自定义Header类和重写代理逻辑:
// 标记可序列化的自定义Header类 [Serializable] public class AuthHeader : SoapHeader { public string Username { get; set; } public string Password { get; set; } } // 继承自动生成的ASMX服务代理类 public class CustomSoapClient : YourAsmxServiceProxy { public AuthHeader AuthHeader = new AuthHeader(); }
- 调用时直接赋值Header即可:
var client = new CustomSoapClient(); client.AuthHeader.Username = "实际用户名"; client.AuthHeader.Password = "实际密码"; var result = client.YourServiceMethod();
场景3:手动构造SOAP请求发送
如果未添加服务引用,直接通过HTTP请求调用服务,可直接拼接SOAP报文:
// 构造完整SOAP请求报文,替换占位符为实际参数 string soapXml = $@"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Header> <Username>实际用户名</Username> <Password>实际密码</Password> </soap:Header> <soap:Body> <YourServiceMethod xmlns=""http://你的服务命名空间""> <参数名>参数值</参数名> </YourServiceMethod> </soap:Body> </soap:Envelope>"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("你的服务地址"); request.ContentType = "text/xml; charset=utf-8"; request.Method = "POST"; request.Headers.Add("SOAPAction", "http://你的服务命名空间/你的方法名"); // 写入请求内容 using (var writer = new StreamWriter(request.GetRequestStream())) { writer.Write(soapXml); } // 读取响应 using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { string responseContent = reader.ReadToEnd(); // 解析响应逻辑 }
注意事项
- 所有示例中的命名空间、服务地址、方法名、Header字段名均需替换为服务提供方指定的实际值
- 若服务要求密码加密传输,需先按照服务方提供的规则加密后再传入Header
- 生产环境禁止硬编码用户名密码,建议存储在配置文件的加密节点中
内容的提问来源于stack exchange,提问作者Cengizhan Bozkurt
相关产品推荐
相关产品推荐

