您可以通过在从wsdl生成的代理类中使用SoapHeader属性来向方法调用添加SOAP头信息。
例如,当您“添加Web引用”时,wsdl.exe将为Web服务引用生成客户端代理类Reference.cs。在上面提到的链接
https://stage.totalcheck.sensis.com.au/service/webservice?wsdl中,有一个名为suggestAddress的消息,它将被翻译成在Visual Studio中添加Web引用时在生成的reference.cs客户端代理代码文件中的一个方法。默认情况下,当调用此方法时,SOAP信封中不会包含头信息。要向此请求的envelope中添加SoapHeader,请在Reference.cs生成的类中,即SuggestAddress方法的顶部添加[SoapHeader("Security")]属性,其中“Security”是继承自SoapHeader基类的类。
对于上述所需的安全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>