Довольно старый пост, но может быть полезным для других.
При интеграции WSDL в Visual Studio вы получаете новый класс, производный от SoapHttpClientProtocol
в новом пространстве имен.
К счастью, этот класс является частичным, это означает, что вы можете расширить его в своем коде, чтобы сделанные вами изменения не были перезаписаны при обновлении из WSDL.
Мой сгенерированный WSDL класс:
namespace TheServiceNameSpace {
public partial class TheClassName : System.Web.Services.Protocols.SoapHttpClientProtocol {
//Class Code
}
}
Чтобы добавить пользовательский заголовок, я добавляю в свой проект новый файл cs со следующим содержимым:
namespace TheServiceNameSpace
{
public partial class SecurityHeader : SoapHeader
{
public String username { get; set; }
public String password { get; set; }
public String apikey { get; set; }
}
public partial class TheClassName
{
public SecurityHeader SEC = new SecurityHeader() { username = "xxxx", password = "xxxx", apikey = "xxxx" };
protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize)
{
message.Headers.Add(SEC);
return base.GetWriterForMessage(message, bufferSize);
}
}
}
Что он делает, это:
- 1 - создание пользовательского заголовка SOAP, который содержит ожидаемые переменные
- 2 - Расширить созданный класс, добавив ссылку на новый заголовок
- 3 - переопределить метод GetWriterForMessage, чтобы я мог добавить свой заголовок в запрос, который будет отправлен в службу.