(Попытка) выполнить миграцию с WSE 3.0 на WCF для клиентского кода

Я был по всей сети для этого. Я только что делал это, и поставщик, чей веб-сервис я пытаюсь использовать, отказывается официально поддерживать WCF как метод потребления.

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

The service

В моей компании мы используем приложение поставщика, которое предоставляет сервис. Приложение написано на Java, и похоже, что wsdl был создан с Apache Axis 1.2.

The code

Мой старый код использует WSE 3.0. В частности, он использует прокси-классы, имеющие «WSE». авто-прикрепленный в конце. Это позволяет мне использовать гораздо более простую схему аутентификации (единственный способ заставить ее работать). Мне не нужно использовать сертификаты. Я использую производную отSecurityPolicyAssertionи завернуть вPolicy объект, который передается вSetPolicy метод клиентского класса. Вот все, что мне нужно сделать для создания рабочего экземпляра клиента:

MyWebServiceWse api = new MyWebServiceWse();
api.Url = myUrl;
api.SetPolicy(new Policy(new MyDerivedSecurityAssertion(user, pass)));

Мой стандартный код для WCF (сгенерированный со ссылкой на службу) не принимает учетные данные, поэтому я знаю, что это проблема сразу же. Я читал в Интернете разные вещи об использовании разныхsecurity или обязательные настройки в моемapp.config, но ничего никогда не работало полностью. Моя самая распространенная ошибка после обильного ковырянияWSDoAllReceiver: Request does not contain required Security header.

Здесь app.config. Возможно, мы могли бы начать с того, чтобы рассказать мне, что следует изменить здесь, чтобы облегчить передачу полномочий - опять же, я видел различные мнения в Интернете.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MySoapBinding" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://xyz:12345/services/MyService"
                binding="basicHttpBinding" bindingConfiguration="MySoapBinding"
                contract="MyNS.MyService" name="MyService" />
        </client>
    </system.serviceModel>
</configuration>

Я изменил некоторые атрибуты, чтобы скрыть конкретный сервис, который мы используем (политика компании и все такое).

И вот пример кода C # (тестирование в консольном приложении):

MyClient client = new MyClient();
client.listMethod();

UPDATE

Прочитайте это ТАК сообщение:ВКФ безопасности. , ,.

Я соответствующим образом обновил свой app.config и теперь передаю имя пользователя и pwd в коде. Я все еще получаю ту же ошибку:

WSDoAllReceiver: Request does not contain required Security header

20120517 UPDATE

Успешный запрос (от WSE3):

  <soap:Header>
    <wsa:Action>
    </wsa:Action>
    <wsa:MessageID>urn:uuid:cb739422-c077-4eec-8cb2-686837b76878</wsa:MessageID>
    <wsa:ReplyTo>
      <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
    </wsa:ReplyTo>
    <wsa:To>http://removed-for-security</wsa:To>
    <wsse:Security soap:mustUnderstand="1">
      <wsu:Timestamp wsu:Id="Timestamp-e13feaf9-33d9-47bf-ab5b-60b4611eb81a">
        <wsu:Created>2012-05-17T11:25:41Z</wsu:Created>
        <wsu:Expires>2012-05-17T11:30:41Z</wsu:Expires>
      </wsu:Timestamp>
      <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-00c26e1a-3b3b-400f-a99a-3aa54cf8c8ff">
        <wsse:Username>change-to-protect-the-innocent</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">nice-try</wsse:Password>
        <wsse:Nonce>KJMvUuWF2eO2uIJCuxJC4A==</wsse:Nonce>
        <wsu:Created>2012-05-17T11:25:41Z</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  </soap:Header>
  <soap:Body>
    <listChannels xmlns="http://removed-for-security">
      <rowfrom>0</rowfrom>
      <rowto>10</rowto>
    </listChannels>
  </soap:Body>
</soap:Envelope>

Работаю над получением трассы WCF - скоро добавлю.

20120517 UPDATE 2

А вот и конверт из WCF:

  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
      <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"></Action>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <listChannels xmlns="http://removed-for-security">
        <rowfrom>1</rowfrom>
        <rowto>2147483647</rowto>
      </listChannels>
    </s:Body>
  </s:Envelope>

20120518 UPDATE Я попытался реализовать решение в посте, на который Майк Миллер ссылается в комментариях. Теперь я получаю следующую ошибку (ни одно сообщение не заканчивается отправкой, потому что в схеме что-то не так):

The provided URI scheme 'http' is invalid; expected 'https'.

И если кто-то захочет спросить, да, мне нужно отправить по http, и да, я знаю, что учетные данные отправляются в виде незашифрованных строк :-)

Ответы на вопрос(1)

Ваш ответ на вопрос