2010-03-25 124 views
1

我有一個WCF服務託管在我的Server1上的Windows服務上。它在這臺機器上也有IIS。我從一個網絡應用程序調用服務,它工作正常。但在此服務中,我必須調用位於Server2上的另一個WCF服務(也託管在Windows服務上)。安全憑證設置爲「消息」和「用戶名」。我有一個錯誤,如「SOAP協議失敗」。這是我的服務器證書公鑰出現問題,似乎無法識別。但是,如果我在控制檯應用程序中從Server1調用Server2上的服務,則它工作正常。從另一個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> 

下面是從web應用程序的配置文件調用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」有關?

+0

你也有從server2的配置? – albertjan 2010-03-25 15:23:31

+0

你解決了這個問題嗎? – 2010-12-07 00:06:37

回答

1

當您從控制檯應用程序調用服務時,您處於登錄用戶的安全上下文中。

當您從運行在IIS中的服務調用服務時,使用默認設置,您處於本地帳戶NETWORK SERVICE的安全上下文中。

修復它的方法可能是在web.config的system.web部分設置impersonate = true。

2

那麼,最後它只是一個信任客戶機上的證書頒發者的問題。在教程中提到它,我一定錯過了這一步。仍然想知道爲什麼它從控制檯應用程序調用時工作,但是...無論如何,它現在工作正常。

謝謝!