【问题标题】:Hosting WCF service on IIS在 IIS 上托管 WCF 服务
【发布时间】:2011-04-22 05:22:25
【问题描述】:

我正在尝试使用 IIS 托管 WCF 服务(在 Cassini 中运行良好)。但是,当我在 IIS 中托管它时,出现以下错误:

“与服务器建立连接成功,但是在登录过程中发生错误。(提供者:共享内存提供者,错误:0 - 管道的另一端没有进程。)”

我认为这可能是由于IIS和Windows身份验证,所以我将连接字符串更改为使用uid和密码直接登录数据库,没有区别。我认为我没有走那么远,因为如果是这种情况,我会预料到一个 sql 安全错误。

我已经设置了一个全新的服务器(2008 年),但我仍然遇到同样的问题......

我需要实施什么设置才能实现这一目标?

WCF 代码示例

private GenericDataClassesDataContext _db = new GenericDataClassesDataContext();

 public ReferenceValue[] GetReferenceValues()
        {
            try
            {
                return _db.ReferenceValues.ToArray();
            }
            catch (Exception e)
            {
                throw new FaultException(e.Message);
            }
        }

Web.Config

<?xml version="1.0"?>
<configuration>
    <appSettings/>
    <connectionStrings>
    <!--<add name="TtasConnectionString" connectionString="Data Source=stdev07;Initial Catalog=Ttas;;uid=srvTtas;pwd=pa$$w0rd;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>-->
    <add name="TTASConnectionString" connectionString="Data Source=STDEV07;Initial Catalog=IRF;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
    </connectionStrings>

  <system.web>
        <compilation debug="true" targetFramework="4.0">
        </compilation>
        <authentication mode="Windows"/>
    <identity impersonate="true"/>      
        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
    <system.serviceModel>   
        <extensions>
   <behaviorExtensions>
    <add name="silverlightFaults" type="Moe.Tactical.GenericData.Wcf.SilverlightFaultBehavior, Moe.Tactical.GenericData.Wcf, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
   </behaviorExtensions>
  </extensions>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>   
    <behaviors>
       <endpointBehaviors>
          <behavior name="SilverlightFaultBehavior">
             <silverlightFaults />
          </behavior>
       </endpointBehaviors>
       <serviceBehaviors>
          <behavior name="Moe.Tactical.GenericData.Wcf.GenericDataServiceBehavior">
             <serviceMetadata httpGetEnabled="true" />
             <!--<serviceDebug includeExceptionDetailInFaults="false" />-->
             <serviceDebug includeExceptionDetailInFaults="true"/>
          </behavior>
       </serviceBehaviors>
    </behaviors>
    <bindings>
            <basicHttpBinding>
                <binding name="winAuthBasicHttpBinding">
                    <security mode="TransportCredentialOnly">
                        <transport clientCredentialType="Ntlm"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <services>
            <service behaviorConfiguration="Moe.Tactical.GenericData.Wcf.GenericDataServiceBehavior" name="Moe.Tactical.GenericData.Wcf.GenericDataService">
                <!--bindingConfiguration="winAuthBasicHttpBinding" [in gap]-->
                <endpoint address=""
                  binding="basicHttpBinding"
                  behaviorConfiguration="SilverlightFaultBehavior"
                  contract="Moe.Tactical.GenericData.Wcf.IGenericDataService">
                    <identity>
                        <dns value="localhost:3637"/>
                    </identity>
                </endpoint>
                <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>-->
            </service>
        </services>

    </system.serviceModel>
</configuration>

【问题讨论】:

  • 你需要的设置是“SHOW_FULL_EXCEPTION”和“POST_THE_CODE”
  • 在旁注中,我无法弄清楚如何调试它(所以我无法获得完整的异常,并且 faultexception 不起作用......),就像我改变 VS使用 IIS 而不是 cassini,然后我收到错误“Internet Explorer 无法显示网页”
  • 这里有一个想法:停止进食异常。完全摆脱那个 try/catch 块。这样,它可能会记录在 Windows 事件日志中。如果没有,请打开 WCF 跟踪并重试。它在 WCF 日志中。
  • 啊,当我打开跟踪时,错误消息更改为“用户 'IIS APPPOOL\GenericData' 登录失败”。这显然不是用户名!将进一步调查

标签: sql-server wcf iis-6


【解决方案1】:

我认为原因在 web.config 的以下行:

    <identity impersonate="true"/>  

你应该把它改成

    <identity impersonate="false"/> 

【讨论】: