Преобразование примера кода WSE в WCF - PullRequest
5 голосов
/ 22 апреля 2009

Я новичок как в WSE, так и в WCF, и я пытаюсь использовать веб-сервис с использованием WCF, но вся документация для примера относится к VS2005 + WSE. Этот веб-сервис использует WS-Security 1.0. Я добавил ссылку на сервис через визуальную студию, но не знаю, как сделать эквивалент кода ниже в WCF:

// 1. Initialize the web service proxy
PartnerAPIWse integrationFramework = new PartnerAPIWse();

// 2. Set the username/password. This is using the Username token of WS-Security 1.0
UsernameTokenProvider utp = new UsernameTokenProvider("username", "password");
integrationFramework.SetClientCredential<UsernameToken>(utp.GetToken());

// 3. Declare the policy
Policy policy = new Policy(new UsernameOverTransportAssertion());
integrationFramework.SetPolicy(policy);

1 Ответ

8 голосов
/ 23 апреля 2009

Потратив день на эксперименты, я понял, как преобразовать этот код. Ключ настраивал привязки на прокси WCF, который VS2008 делает правильно.

  1. Добавить сервисную ссылку, указывающую на WSDL
  2. Откройте App.config / Web.config и найдите раздел system.serviceModel. Измените режим безопасности для привязки мыла по умолчанию на TransportWithMessageCredential. Вот как выглядел мой файл после изменения:

            <basicHttpBinding>
            <binding name="SoapBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
                receiveTimeout="00:10:00" sendTimeout="00:10: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="TransportWithMessageCredential">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    
  3. Измените приведенный выше пример кода, чтобы он выглядел следующим образом

    Dim integrationFramework As New SoapClient()
    integrationFramework.ClientCredentials.UserName.UserName = "username"
    integrationFramework.ClientCredentials.UserName.Password = "password"
    

TransportWithMessageCredential эквивалентно политике UsernameOverTransportAssertion в WSE 3.0

...