Как подключиться к службе WCF с помощью пользовательской привязки из неуправляемого C ++ - PullRequest
26 голосов
/ 20 апреля 2011

Мне нужно подключиться к службе WCF из собственного приложения C ++. Я попробовал ссылку ниже, и она работала с wsHttpBinding.

Создание службы WCF для неуправляемых клиентов C ++

Однако мне нужно подключиться к службе WCF с пользовательской привязкой. Вот так выглядит код для пользовательской привязки в файле конфигурации моего приложения

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="ResourceCenterEndpoint5">
          <mtomMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
            messageVersion="Default" maxBufferSize="65536" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192"      maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          </mtomMessageEncoding>
          <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                    maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Ntlm"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    keepAliveEnabled="true" maxBufferSize="65536"
                    proxyAuthenticationScheme="Anonymous"
                    realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                    useDefaultWebProxy="true" />
        </binding>
      </customBinding>
      </binding>
    </bindings>
    <client>
      <endpoint address="http://usaabcxyzas1.na.abc.com/Build15/ReserSVC/Resource.svc"
      binding="customBinding" bindingConfiguration="ResourceCenterEndpoint5"
      contract="ServiceReference2.ResourceCenterServiceContract"
      name="ResourceCenterEndpoint5">
        <identity>
          <userPrincipalName value="devlts_srv@na.abc.com" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

У меня есть DLL-библиотека моста, которая является управляемой C ++ DLL. Управляемая C ++ DLL соединяет клиент C # с собственным приложением. Однако я не могу подключиться к веб-службе из управляемой C ++ DLL, поскольку веб-служба использует настраиваемое связывание. Я получаю ошибку:

HTTP-запрос не авторизован с помощью схемы аутентификации клиента «Аноним». Заголовок аутентификации, полученный от сервера, был 'Negotiate, NTLM'

Вот как я пытался подключиться к веб-сервису из управляемого C ++ dll:

Binding^ binding = gcnew BasicHttpBinding();

EndpointAddress^ address = gcnew EndpointAddress(gcnew String("http://usaabcxyzas1.na.abc.com/Build15/ReserSVC/Resource.svc"));

HelloServiceClient::ServiceReference2::ResourceCenterServiceContractClient^ client = gcnew HelloServiceClient::ServiceReference2::ResourceCenterServiceContractClient(binding, address); 
client->DoWork();

Так что в основном мне нужно подключить управляемую DLL C ++ к службе WCF с помощью пользовательского связывания. Как я могу это сделать?

Ответы [ 6 ]

2 голосов
/ 15 февраля 2012

Вы пытаетесь использовать BasicHttpBinding в своем клиентском коде.

В конфигурационном файле вам требуется NTLM:

authenticationScheme="Ntlm"

Ошибка указывает на то, что у вас есть в файле конфигурации службы.

*The http request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the sever was 'Negotiate,NTLM'*

Вы также выглядите так, как будто пытались взломать

proxyAuthenticationScheme="Anonymous"

Так что все сводится к вашим требованиям безопасности. Если вы хотите, чтобы служба не имела безопасности, просто удалите ссылку на NTLM. Если вы хотите обеспечить безопасность, вам понадобится раздел безопасности в определении привязки, например:

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

Посмотрите на эту статью для более

1 голос
/ 13 февраля 2012

Я поддерживаю нативные приложения c ++, которые используют сервисы Wcf.Вместо того, чтобы иметь дело с необработанными соединениями и XML, я рекомендую использовать превосходную библиотеку gSoap.Это берет WSDL из сервиса и генерирует код для работы с ним.При использовании плагина http://code.google.com/p/gsoapwininet/ все коммуникации направляются через IE, что означает, что все различные методы проверки подлинности Windows поддерживаются автоматически, что должно решить вашу конкретную проблему.

1 голос
/ 01 февраля 2012

Для меня это похоже на ошибку аутентификации, поэтому вам нужно дать себе больше разрешений или узнать, кому это нужно, но, например, указать имя пользователя и пароль.

1 голос
/ 03 ноября 2011

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

Также вы упомянули, что хотите подключиться с помощью CustomBinding, но в коде клиента вы используете BasicHttpBinding.

Еще одна вещь, в которой вам нужно установить свой код, это AuthenticationScheme, поскольку сервер ожидает схему NTLM, а ваш клиентский код не устанавливает ее, и по умолчанию он является анонимным.

1 голос
/ 27 июля 2011

Я не думаю, что вы хотите настраивать привязку так, как вы хотите настроить привязки из коробки. Если только вы не намеревались создать пропиетарный протокол связи вне протокола TCP / IP и т. Д.

Что касается проблемы безопасности, вам следует изучить настройки свойств Security.Mode, а также назначить правильные свойства безопасности транспорта и / или сообщений. например. использовать сертификат или пароль, шифровать, шифровать и подписывать и т. д.

Вам также нужно будет сделать то же самое на стороне клиента. Привязка должна быть почти такой же, как на стороне сервера.

Если вам не нравится basicHttp, всегда есть TCP, MSMQ, именованный канал и так далее. Вы должны найти его, чтобы получить полный список.

0 голосов
/ 05 мая 2011

Вы можете создать customBinding и передать требуемое имя конфигурации привязки.

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