Раньше мне приходилось создавать пользовательские заголовки SOAP в проекте C #, в котором использовалась импортированная веб-ссылка WSDL. Я нашел способ сделать это, но я никогда не был доволен этим, и у меня возникло сомнение, есть ли лучший способ. Что я сделал, так это создал заголовок, производный от SoapHeader:
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://model.test.net")]
[System.Xml.Serialization.XmlRootAttribute("securitytoken", Namespace = "http://model.test.net", IsNullable = false)]
public class SpecialHeader : SoapHeader
{
[System.Xml.Serialization.XmlTextAttribute()]
public string aheadervalue;
}
Затем мне пришлось изменить код, сгенерированный из WSDL, и добавить ссылку
до экземпляра нового заголовка и следующего перед каждым веб-вызовом, который
Я хотел содержать пользовательский заголовок:
[System.Web.Services.Protocols.SoapHeaderAttribute("instancename", Direction=System.Web.Services.Protocols.SoapHeaderDirection.InOut)]
Где "instancename" - это имя переменной экземпляра пользовательского заголовка в сгенерированном классе.
Это прекрасно работает, за исключением того, что любое изменение в WSDL требует, чтобы все это было сделано заново, поскольку оно восстанавливает класс. В других языках заголовки могут быть добавлены за пределы сгенерированного кода, поэтому, возможно, мне не хватает способа, который делается в C #. Есть ли лучшие способы сделать это?