В прошлом мне приходилось создавать собственные заголовки 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 требует, чтобы все это было сделано снова, поскольку оно перегенерирует класс. В других языках заголовки могут быть добавлены вне сгенерированного кода, поэтому, возможно, мне не хватает того, как это делается в С#. Есть ли лучшие способы сделать это?