C#web服务 - 静态成员变量在空闲时间30分钟后变空

时间:2011-01-12 15:45:23

标签: c# web-services

我们已经实现了C#Web服务并部署在IIS 6.0服务器

根据要求,我需要创建一个会话并在应用程序域上无限期地保持相同的会话,直到我们重新启动服务。

为了实现这一点,我在类中创建了一个静态成员变量来保存会话并在第一次调用时创建会话。这意味着会话将跨应用程序范围中的所有实例进行。以下是代码段

public Class MyClass{

 private static ESession session = null;

 public void testMethod(string configlocation){

  if (session == null)
  {
   ISessionConfigurer sessionConfigurer = new ESessionConfigurer();
   sessionConfigurer.ConfigLocation = configLocation;

   session = sessionConfigurer.CreateSession() as ESession;
  }
 }
}

这里我无法在声明本身上实例化会话对象,因为它需要从其他类传递参数'configLocation'。

我观察到的是,会话对象可用于所有实例的多次调用,但在30分钟的空闲时间之后,会话对象再次设置为null。

我最初的想法是,由于IIS服务器回收对象,这种情况正在发生。这是对的吗?如果是的话如何防止物品永远回收?我需要在IIS服务器6.0应用程序池上设置哪些配置参数

如果我们将应用程序池设置为不回收内存问题等,或者是否有更好的方法来实现我的要求,是否有任何影响。

3 个答案:

答案 0 :(得分:4)

“无限期地保持相同的会话”不是解决此问题的正确方法,也不是为了防止AppDomain卸载而摆弄IIS。

不需要任何时髦配置的更好的长期解决方案是在应用程序终止之前将会话持久保存到文件,数据库或其他位置。当应用程序重新启动时,您可以重建持久会话(如果存在),或者创建一个新会话。

最简单的方法是使用应用程序根目录下的global.asax文件(如果它不存在,Visual Studio可以为您创建一个,或者您可以在线找到大量样本自己创建它,然后覆盖以下方法:

void Application_Start(object sender, EventArgs e)
{
    // initialize your session
}

void Application_End(object sender, EventArgs e)
{
    // persist your session
}

答案 1 :(得分:2)

为什么不使用ASP.NET SQL Server Session State

答案 2 :(得分:0)

C#Web Service就像一个C#Asp网站。 IIS在某个(可配置的)时间后从内存中卸载它。当用户连接之后,它将被编译并使用默认变量再次运行。

添加pinger,更改IIS时间或将其转换为WCF,以便您可以在自己的WindowsService类实例中托管它。我更喜欢最后一个解决方案,因为你得到了控制权,这不是一种解决方法,而是最佳实践。