您可以通过装饰使用SoapHeader属性从wsdl生成的代理类中的方法,将soap头信息添加到方法调用中。
例如,当您“添加Web引用”时,wsdl.exe将为Web服务引用生成客户端代理类Reference.cs。在上面提到的链接https://stage.totalcheck.sensis.com.au/service/webservice?wsdl中,有一条消息suggestAddress,它会在您从Visual Studio添加Web引用时转换为生成的reference.cs客户端代理代码文件中的方法。默认情况下,当这个方法被调用时,肥皂包中将不会有Header。要将SoapHeader添加到此请求的信封中,请将[SoapHeader(“Security”)]属性添加到Reference.cs生成的类中的SuggestAddress方法的顶部,其中“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>
在利用这个问题来帮助自己也承认(如一些人士指出)有问题的标题是那些WS-Security标准
'wsse'看起来像通常用于WS-Security的前缀。另外,由于SOAP服务是自描述的,因此我无法找到WSDL中未定义头的有效原因。 – 2011-04-20 14:24:21
这很好。但就像我说的,我不想触摸自动生成的类。我只是修改这个只是为了生成类。 – 2011-04-20 14:47:46
自动生成的类是一个部分类。也许你可以将头添加到另一个类的一部分。当自动生成的文件再次生成时,它不会改变。 – 2011-04-20 14:57:23