Как передать заголовок мыла, когда WSDL не определяет его? - PullRequest
3 голосов
/ 14 февраля 2009

У меня есть веб-сервис, которому я звоню, и их опубликованный WSDL на самом деле не определяет большую часть сервиса, 3/4 из которого вам придется создавать вручную.

Проблема, с которой я столкнулся, заключается в том, что им нужен SoapHeader с некоторой конкретной информацией, но у меня нет никакого способа сделать это. Единственные реальные вещи, которые у меня есть для сервиса, - это созданный прокси-метод (MyMethod), которому я могу передать свое сообщение. Как я могу установить / отправить заголовок мыла вместе с ним?

Все сервисы, которые у меня были, я мог использовать автоматически связанные элементы из Visual Studio.

Ответы [ 4 ]

2 голосов
/ 18 февраля 2009

Мне удалось это сделать, изменив автоматически сгенерированный прокси-код вручную и просто внедрив класс, унаследовавший «SoapHeader», и добавил атрибут в метод!

Я не могу заново сгенерировать или обновить прокси-сервер, но он выполнил свою работу и занял всего 15 минут.

1 голос
/ 04 июня 2016

Довольно старый пост, но может быть полезным для других.

При интеграции 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, чтобы я мог добавить свой заголовок в запрос, который будет отправлен в службу.
1 голос
/ 14 февраля 2009

Возможно, вы захотите увидеть это для чего-то подобного; кажется, что это выполнимо, но много работы ... или вы можете построить весь запрос вручную (еще хуже ...).

0 голосов
/ 10 июля 2012

Если вам нужен точный контроль зерна при визуализации XML-заголовка мыла (происходит при взаимодействии с веб-сервисом, написанным на Java), вы всегда можете переопределить весь рендеринг, реализовав IXmlSerializable

[XmlRoot("customHeader", Namespace = "http://somecompany.com/webservices/security/2012/topSecret")]
public class customHeader: SoapHeader, IXmlSerializable
{
    public customHeader()
    {
        Actor = "http://schemas.xmlsoap.org/soap/actor/next";
        MustUnderstand = false;
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
        //throw new NotImplementedException();
    }

    public void ReadXml(XmlReader reader)
    {
        //throw new NotImplementedException();
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("soap:actor", Actor);
        writer.WriteAttributeString("soap:mustUnderstand", MustUnderstand ? "1" : "0");
        writer.WriteRaw("some encrypted data");
        //get it exactly the way you want it in here without mucking with Xml* property attributes for hours on end
        //writer.WriteElement(...);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...