Подтвердить что ты не робот

Как подключиться к службе WCF с помощью Custom Binding из неуправляемого С++

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

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

Однако мне нужно подключиться к службе 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="[email protected]" />
        </identity>
      </endpoint>
    </client>
  </system.serviceModel>
</configuration>

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

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

Вот как я пытался подключиться к Webservice из управляемой 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 к службе WCF с пользовательской привязкой. Как я могу это сделать?

4b9b3361

Ответ 1

Вы пытаетесь использовать 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>

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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