2010-03-25 4 views
1

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

Я после этого учебника, чтобы настроить свои сертификаты: 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> 

Любая идея, почему это работает, если если я называю это в консольного приложения, а не от моей службы ? Может быть, это имеет какое-то отношение к сертификатуValidationMode = «ChainTrust»?

+0

У вас также есть конфиг с сервера2? – albertjan

+0

Вы решили эту проблему? –

ответ

1

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

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

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

2

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

Спасибо!