【问题标题】:IIS 7 Application Pool - Can't connect to WCF ServiceIIS 7 应用程序池 - 无法连接到 WCF 服务
【发布时间】:2010-03-02 23:40:30
【问题描述】:

您好, 我必须关注问题。我有一个在 IIS7 下运行的 WCF 服务。应用程序连接到它,WCF 服务向 DB 发出一些请求。我在 SQL Server 2005 的活动监视器中注意到,在恰好有 102 个活动连接之后,IIS7 中的应用程序池挂起。在此之后,我无法连接到我的 WCF 服务。然后只有 IIS7 重启有帮助。 对于我使用 ChannelFactory 的连接,每次请求后它都会关闭。我还引入了这样的代码来确保 Channel 已关闭:

catch (FaultException)
{
    Factory.Abort();
    return null;
}
catch (CommunicationException)
{
    Factory.Abort();

    return null;
}
catch (TimeoutException)
{
    Factory.Abort();
    return null;
}
catch (Exception ex)
{
    Factory.Abort();
    return null;
}

finally
{
    Factory.Close();
    Factory.Abort();
}

我的服务类也有以下行为:

[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Multiple, AutomaticSessionShutdown=true)]

我的服务 web.config 文件中还有以下内容:

<serviceBehaviors>
<behavior name="Server.Service1Behavior">
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>

      <serviceThrottling maxConcurrentCalls="2147483647"
        maxConcurrentSessions="2147483647"
        maxConcurrentInstances="2147483647" />

我什么都试过了。请帮助我,因为用户不能这样工作。为什么在与数据库应用程序池的 102 个连接挂起后会发生这种情况? 这是调用数据库的代码

internal SqlConnection CheckIfConnectionOpen()
    {
        if (_Connection.State != ConnectionState.Open)
        {
            _Connection.Open();
        }
        return _Connection;
    }
using (SqlCommand cmd = new SqlCommand(query, _Connection))
    { 
CheckIfConnectionOpen();
//some parameters for sqlcommand here and execute nonQuery or execute reader
}

有人可以帮我解决这个问题吗,因为我仍在寻找解决方案

【问题讨论】:

    标签: wcf iis-7


    【解决方案1】:

    从长远来看,下面的链接解释了应用程序池崩溃时无法重新启动的情况。如果您可以让它重新启动,那应该会降低问题的严重性。

    http://i.nconspicuo.us/2008/06/25/iis7-on-windows-server-2008-503-service-unavailable-error-application-pool-stops-unexpectedly/

    您提到您已检查通道已关闭,确认数据库连接也已关闭可能会很好。

    希望这会有所帮助!

    【讨论】:

    • 我已经设置了 StartAutomatically 并增加了最大失败次数。我没有帮忙。如何查看数据库连接是否已关闭?
    • 这取决于您的数据访问层。您是使用 OR/M 还是自己管理 SessionScope/TransationScope/DBConnection 对象?
    • 我自己管理 SessionScope/TransationScope/DBConnection 对象,每个 select 查询都以下面的语句 using(SqlCommand sqlcmd = new SqlCommand(...)) 开头,我在“using”中也有 TransactionScope跨度>
    • 好的。您是否有一个调用了 scope.Complete() 方法的 finally 子句?这将保证交易是关闭的。您还可以监视与数据库的连接数:“select db_name(dbid) as db, count(dbid) as connection from sys.sysprocesses where dbid > 0 group by dbid”
    • 是的,我有 scope.Complete() 子句。当我只使用包含在 using(SqlCommand sqlcmd = new SqlCommand(query, connection)){} 中的简单 SELECT 函数时,就会出现问题
    【解决方案2】:

    您可以设置一个网络农场(同一 IIS 的多个进程),这将有助于最大限度地减少问题,并减少对单个进程的依赖(如果一个进程死亡并重新启动,其他进程可以在那里支撑堡垒直到它重新启动。

    【讨论】:

      【解决方案3】:

      顺便说一句,您上面的代码相当于:

      catch (Exception ex)
      {
          Factory.Abort();
          return null;
      }
      finally
      {
          Factory.Close();
          Factory.Abort();
      }
      

      而且情况同样糟糕。您可能希望在某处记录异常,以便了解发生了什么。

      我想看看调用数据库的代码。我担心你可能没有正确清理。

      【讨论】:

      • 这里是调用数据库内部 SqlConnection CheckIfConnectionOpen() { if (_Connection.State != ConnectionState.Open) { _Connection.Open(); } 返回_连接; } using (SqlCommand cmd = new SqlCommand(query, _Connection)) { //这里sqlcommand的一些参数 //并执行nonQuery或执行reader }
      • 实际上catch代码并没有捕捉到任何异常,我只是得到了来自服务器的空响应。
      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      相关资源
      最近更新 更多