Вызов службы WCF из другой службы WCF - PullRequest
1 голос
/ 25 марта 2010

У меня есть служба WCF, размещенная в службе Windows на моем сервере Server1. На этой машине также есть IIS. Я звоню в сервис из веб-приложения, и он работает нормально. Но в рамках этой службы мне нужно вызвать другую службу WCF (также размещенную в службе Windows), расположенную на сервере Server2. Учетные данные безопасности установлены на «Сообщение» и «Имя пользователя». У меня есть ошибка типа «Не удалось провести протокол SOAP». Это проблема с моим открытым ключом сертификата сервера, который, кажется, не распознается. Однако, если я вызываю службу на сервере Server2 с сервера Server1 в консольном приложении, она работает нормально.

Я следовал этому руководству, чтобы настроить свои сертификаты: http://www.codeproject.com/KB/WCF/wcf_certificates.aspx

Вот файл конфигурации моего сервиса на сервере Server1, который пытается вызвать второй:

    <endpoint address=""
              binding="wsHttpBinding"
              contract="Microsoft.ServiceModel.Samples.ITraitement" />


    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
  </service>

</services>

<client>
  <endpoint address="http://Server2:8000/servicemodelsamples/service"
    behaviorConfiguration="myClientBehavior" binding="wsHttpBinding"
    bindingConfiguration="MybindingCon" contract="Microsoft.ServiceModel.Samples.ICalculator"
    name="">
    <identity>
      <dns value="ODWCertificatServeur" />
    </identity>
  </endpoint>
</client>

<bindings>
  <wsHttpBinding>
    <binding name="MybindingCon">
      <security mode="Message">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceTraitementBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="True" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="myClientBehavior">
      <clientCredentials>
        <clientCertificate findValue="MachineServiceTraitement" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My" />
        <serviceCertificate>
          <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck"/>
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

А вот файл конфигурации из веб-приложения, которое вызывает службу на сервере Server1:

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_ITraitement" closeTimeout="00:01:00"
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
        bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
        maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
        messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
        allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
          enabled="false" />
      <security mode="Message">
        <transport clientCredentialType="Windows" proxyCredentialType="None"
            realm="" />
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
            algorithmSuite="Default" establishSecurityContext="true" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:8020/ServiceTraitementPC"
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITraitement"
      contract="ITraitement" name="WSHttpBinding_ITraitement">
  </endpoint>
</client>

Есть идеи, почему это работает, если я вызываю его в консольном приложении, а не из моего сервиса? Может быть, это как-то связано с certificateValidationMode = "ChainTrust"?

Ответы [ 2 ]

2 голосов
/ 29 марта 2010

Ну, наконец, это был просто вопрос доверия издателю сертификата на клиентском компьютере. Это было упомянуто в учебнике, и я, должно быть, пропустил этот шаг. Все еще удивляетесь, почему он работает при вызове из консольного приложения, но ... в любом случае, теперь он работает нормально.

Спасибо!

1 голос
/ 25 марта 2010

Когда вы вызываете службу из консольного приложения, вы находитесь в контексте безопасности вошедшего в систему пользователя.

Когда вы вызываете службу из службы, работающей в IIS, с настройками по умолчанию, вы находитесь в контексте безопасности локальной сети NETWORK SERVICE.

Способ исправить это, вероятно, установить impersonate = true в разделе system.web вашего web.config.

...