You need to enable JavaScript to run this app. 如何在C#中为SOAP Service添加包含用户名密码的请求头
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 21:36:01