我的网站程序集是否总是在同一个AppDomain中运行?

时间:2015-04-09 20:32:44

标签: asp.net .net session iis-7 appdomain

我已经构建了两个不同的用户控件库,可以在我的SharePoint 2007站点上使用。一个为电子商务功能提供用户控件,另一个为帐户仪表板提供。它们都使用经过身份验证的用户/网站会员资格。

所以我构建了一个名为WebAccounts.dll的程序集,它包含所有基本的,通用的帐户功能,例如登录,注销,检索成员数据以及在会话中存储某些成员数据。电子商务图书馆和帐户信息中心库都引用此帐户并在其基础上构建。例如,两者都提供了自己的登录/注销控件版本,用于捕获用户凭据,并将它们传递给WebAccounts进行身份验证,并将经过身份验证的成员对象存储在会话中。

我迷失的地方最终是IIS如何创建AppDomain和这些库的实例。如果我将所有3个程序集放在我的SharePoint站点的bin中,用户是否可以保证使用同一AppDomain中包含的三个程序集的实例?或者在一个页面上,用户的请求进程可能只在AppDomain中加载了电子商务和WebAccounts,而AppDomain中的下一个请求进程只加载了仪表板和WebAccounts?

以防万一:我希望WebAccounts提供Login和Logout事件,以便使用程序集的任何内容都可以执行服务器端操作作为响应。 I.E.用户是否可以使用电子商务,将某些对象添加到会话状态,然后在Dashboard用户控件上单击“注销”,然后在WebAccounts.dll中调用Logout(),在WebAccounts.dll中触发“LoggedOut”事件,并保证我正在使用的电子商务实例(已在应用程序启动时订阅该事件)将能够处理该事件以从会话状态中删除其项目?另一个例子是,如果WebAccounts定义了一个静态变量,那么Ecommerce和Dashboard会在我在网站页面之间导航时使用相同的变量吗?由于这些都在相同的应用程序起点下运行,SharePoint站点在同一个bin中,看起来它们应该都在同一个AppDomain中,它应该可以工作吗?

其他问题是GAC和可扩展性。首先,我的程序集实际上是在GAC中,因为在SharePoint中以这种方式使用它们要容易得多。我的期望是从GAC而不是bin加载它们不会改变AppDomains的设置方式。其次,如果我们要迁移到服务器场,它仍然可以工作。鉴于我们使用的是基于SQL的会话状态,我认为该部分可行。我知道访问静态变量会从请求分解到请求,因为在不同的服务器上会有多个变量实例,但是在单个请求期间,两个用户控制库是否可以可靠地设置和检索变量?我的WebAccounts程序集对于一个网站来说只是一个可怕的想法吗?

1 个答案:

答案 0 :(得分:0)

在正常操作期间,每个网站都有一个工作进程和一个应用程序域(假设您每个应用程序池使用一个网站 - 我不知道有任何不这样做的原因)。

这意味着所有加载的代码将共享相同的静态变量和相同的应用程序状态。

在回收期间,可能有多个工作人员和多个应用程序域,但其内容的结构方式相同。

我不知道Sharepoint如何运作。可能,它作为一个单一的网站运行。因此,加载的所有代码都托管在同一个应用程序域中。

检查两个库是否共享相同应用域的试金石是他们是否可以访问相同的HttpContext.Current

GAC在此处不起任何作用。没有" DLL的实例"。只有一个DLL,它可以加载到不同的应用程序域中。

  

我知道访问静态变量会从请求分解为请求,因为在不同的服务器上会有多个变量实例

这是真的。

  

但是在单个请求期间,两个用户控制库都可以可靠地设置和检索变量

在单个请求期间,只有一个应用程序域涉及处理它。没有例外。无论该app域中加载了什么代码都可以参与。因此,只要Sharepoint决定加载您的代码(并调用它),您就可以设置。

  

我希望WebAccounts提供Login和Logout事件,以便使用程序集的任何内容都可以执行服务器端操作作为响应。

关键问题是:是否有任何导致您的DLL挂钩这些事件的东西?确保是这种情况。您的DLL是否已加载或在何处加载并不重要。关注的是它们中的代码是否被调用以允许它们订阅这些事件。