Добавление неявных заголовков SOAP в WSDL - PullRequest
15 голосов
/ 20 апреля 2011

Мой вопрос похож на этот. Как передать заголовок мыла, когда WSDL не определяет его? Но отличается.

Для веб-службы, которую я использую, все методы требуют аутентификации, которая отправляется в виде открытого текста внутри заголовка SOAP. Однако мой WSDL не содержит никакой информации о заголовке мыла. У меня есть специальный инструмент платформы, который я должен использовать для генерации кода из WSDL. Поскольку информация заголовка недоступна, я не могу напрямую использовать сгенерированный класс - я не хочу вручную изменять код для размещения заголовка.

Я попытался указать заголовок SOAP в WSDL, но мне не удалось получить правильные пространства имен. WSDL здесь https://stage.totalcheck.sensis.com.au/service/webservice?wsdl, а заголовок SOAP выглядит следующим образом:

    <soapenv:Header>
        <wsse:Security>
            <wsse:UsernameToken>
                <wsse:Username>username</wsse:Username>
                <wsse:Password>password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
   </soapenv:Header>

Может ли кто-нибудь мне помочь? Спасибо!

Ответы [ 3 ]

20 голосов
/ 21 апреля 2011

С концептуальной точки зрения WSDL не должен определять заголовки.WSDL предназначен только для определения функциональных аспектов службы, таких как операции, сообщения, привязка и конечные точки.Сообщения и привязки определяют, как полезная нагрузка сообщений должна быть закодирована и отформатирована.

Однако заголовки сообщений SOAP не относятся к полезной нагрузке.Обычно они используются для настройки нефункциональных свойств процессора SOAP.Безопасность является таким нефункциональным свойством.Функциональный аспект полезной нагрузки не затрагивается.Только гарантируется, что связь защищена, и стек инструментов WS, а не реализация службы, должен позаботиться об этом.

Таким образом, отсутствующий фрагмент теперь является стандартом, который позволяет добавлять некоторые нефункциональные требования к службам WSDL, так что генераторы кода могут автоматически определять, какие заголовки необходимо отправить и / или понять для выполнения-функциональное свойство по желанию - без необходимости вручную иметь дело с полями заголовка.Этот стандарт существует и называется WS-Policy .Политика обычно содержит набор альтернатив, представляющих набор требований, которые должны быть в состоянии выполнить как поставщик, так и потребитель.Когда предполагается, что две службы взаимодействуют друг с другом, используются обе политики и рассчитывается так называемая «эффективная политика».Он определяет общие нефункциональные требования.Используя эту информацию, поставщик и потребитель могут настроить себя так, чтобы добавить необходимые заголовки, такие как заголовки WS-Security. WS-SecurityPolicy также определяет набор политик, которые можно использовать. WS-PolicyAttachment определяет, как такие политики могут быть присоединены к WSDL.

Существуют генераторы кода, которые могут работать с WS-политиками, например, Metro или Axis2

4 голосов
/ 06 октября 2012

Вы можете добавить информацию заголовка мыла к вызовам методов, декорировав методы в прокси-классе, сгенерированном из wsdl, с атрибутом SoapHeader.

Например, wsdl.exe сгенерирует прокси-класс клиента Reference.cs дляСсылка на веб-сервис, когда вы «Добавить веб-ссылку».В упомянутой выше ссылке https://stage.totalcheck.sensis.com.au/service/webservice?wsdl есть сообщение offerAddress, которое будет преобразовано в метод в сгенерированном файле кода прокси клиента reference.cs при добавлении веб-ссылки из Visual Studio.По умолчанию при вызове этого метода в конверте мыла не будет заголовка.Чтобы добавить SoapHeader в конверт для этого запроса, добавьте атрибут [SoapHeader ("Security")] в начало метода SuggestAddress в сгенерированном классе Reference.cs, где "Security" - это класс, который наследуется от базового класса SoapHeader.

В качестве примера вышеупомянутого необходимого Security 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; }
}

Затем вы украсите метод SuggestAddress в файле reference.cs, как показано ниже,

[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]));
    }

Это обеспечит, чтобы каждый конверт, созданный при вызове метода offerAddress, содержал заголовок безопасности, похожий на упомянутый выше,

<soapenv:Header>
    <wsse:Security>
        <wsse:UsernameToken>
            <wsse:Username>username</wsse:Username>
            <wsse:Password>password</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>

1 голос
/ 17 октября 2012

Для меня ключевым вопросом при использовании этого вопроса было признание (как некоторые отмечали), что рассматриваемые заголовки соответствуют заголовку стандарта WS-Security.

Если ваш инструмент создания прокси "настроен", то онкажется логичным, что у вас может быть переключатель для автоматического добавления заголовков для WS-Security.Однако, если вы используете WSDL.exe («Добавить веб-ссылку» в Visual Studio), рассмотрите svcutil.exe («Добавить сервисную ссылку»).

Если вы используете прокси WCF, вы можете переопределитьданный конфиг и позволяет WCF добавлять заголовки для вас:

<security mode="TransportWithMessageCredential">
    <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
    <message clientCredentialType="UserName" algorithmSuite="Default" />
</security>

Оттуда вы можете указать пароль:

RemoteSvcProxy.TheirClient client = new RemoteSvcProxy.TheirClient();
client.ClientCredentials.UserName.UserName = "uname";
client.ClientCredentials.UserName.Password = "pwd";

Я не знаю, какой у вас пользовательский инструмент,но, возможно, основа, на которой он основан, также имеет похожие параметры конфигурации.

...