您可以通过使用 SoapHeader 属性装饰从 wsdl 生成的代理类中的方法,将soap 标头信息添加到方法调用中。
例如,当您“添加 Web 引用”时,wsdl.exe 将为 Web 服务引用生成客户端代理类 Reference.cs。在上面提到的链接https://stage.totalcheck.sensis.com.au/service/webservice?wsdl 中有一条消息SuggestAddress,当您添加一个网站时,它将转换为生成的reference.cs客户端代理代码文件中的一个方法来自视觉工作室的参考。默认情况下,调用此方法时,soap 信封中将没有 Header。要将 SoapHeader 添加到此请求的信封中,请将 [SoapHeader("Security")] 属性添加到 Reference.cs 生成的类中 SuggestAddress 方法的顶部,其中“Security”是继承自 SoapHeader 基类的类。
对于上述所需的 Security SoapHeader 示例,您将创建以下类,
public partial class Security : SoapHeader
{
public UserNameToken UserNameToken { get; set; }
}
public partial class UserNameToken
{
public string UserName { get; set; }
public string Password { get; set; }
}
然后,您将在 reference.cs 中装饰 SuggestAddress 方法,如下所示,
[SoapHeader("Security")]
public suggestAddressesResult suggestAddresses([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] addressSearch search) {
object[] results = this.Invoke("suggestAddresses", new object[] {search});
return ((suggestAddressesResult)(results[0]));
}
这将确保在调用方法SuggestAddress 时创建的每个信封都包含一个看起来像上面提到的安全标头,
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>username</wsse:Username>
<wsse:Password>password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>