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

Posted

技术标签:

【中文标题】我的网站程序集是不是总是一起在同一个 AppDomain 中运行?【英文标题】:Will my website assemblies always run in the same AppDomain together?我的网站程序集是否总是一起在同一个 AppDomain 中运行? 【发布时间】:2015-04-09 20:32:43 【问题描述】:

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

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

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

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

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

【问题讨论】:

这不是 IIS 问题,而是 Sharepoint 问题。请重新标记。 @usr 对于非 SharePoint 站点,我也有同样的问题。 SharePoint 经常增加另一层复杂性,因此我将其包括在内。 【参考方案1】:

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

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

在回收过程中,可以有多个工人和多个应用程序域,但它们的内容结构相同。

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

判断两个库是否共享同一个应用程序域的试金石是它们是否可以访问同一个HttpContext.Current

GAC 在这里不扮演任何角色。没有“DLL 的实例”之类的东西。只有一个 DLL,它可以加载到不同的应用程序域中。

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

确实如此。

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

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

我希望 WebAccounts 提供登录和注销事件,以便使用程序集的任何东西都可以执行服务器端操作作为响应。

关键问题是:有什么东西会导致您的 DLL 连接这些事件吗?确保情况确实如此。您的 DLL 是否被加载或在哪里加载都不是问题。问题是它们中的代码是否被调用以允许它们订阅这些事件。

【讨论】:

以上是关于我的网站程序集是不是总是一起在同一个 AppDomain 中运行?的主要内容,如果未能解决你的问题,请参考以下文章

表单出现错误“预期的表或查询集,而不是 str”

我的网站总是崩溃 IE,无法调试

我在哪里把我的 favicon 和 Hugo 放在一起

将 scanf 与 x86-64 GAS 程序集一起使用

跟烤冷面一起做SEO实验:开篇词

如何将“InternalsVisibleTo”属性与强命名程序集一起使用?