在代码中更改Membership.ApplicationName - 线程安全

时间:2010-12-05 16:43:03

标签: c# asp.net iis thread-safety

Membership.ApplicationName属性的MSDN page上(适用于asp.net成员资格提供程序),它会警告尽管可以在代码中更改Membership.ApplicationName,但是ApplicationName属性是对于多次写入而言不是线程安全的,并且更改ApplicationName属性值可能会导致应用程序的多个用户出现意外行为。因此,他们建议避免将其用于“网络应用程序”。

这是因为默认的SqlMembershipProvider被写为单身。但是我的问题是:如果我的申请流程中的所有主题都将Membership.ApplicationName设置为相同的东西,那么可以吗?

我正在考虑在我的IIS机器上安装多个应用程序,每个应用程序都有自己独立的应用程序池。我想将它们指向同一位置,但根据主机名,将应用程序提供程序设置为不同的东西。这不是真的可以吗?它可能不是一个线程安全的操作,但是每个应用程序池都没有自己的进程,因此它自己的实例SqlMembershipProvider?因此,试图为给定Membership.ApplicationName实例设置SqlMembershipProvider的每个线程都会尝试将其设置为相同的东西(适合该主机名的提供者)。或者我错过了什么?

我想主要的问题是,所有asp.net应用程序共享一个SqlMembershipProvider,还是为每个应用程序池进程创建一个单独的应用程序?

1 个答案:

答案 0 :(得分:1)

每个应用程序池都有自己的MemberShip.ApplicationName,因此您可以安全。

关于SQL Membership Provider,同样适用。因为每个站点都在自己的应用程序池中,所以它们是不同的并且是分开的。

实际上即使在相同的应用程序池中,但是你有单独的ASP.NET应用程序(即你在每个文件夹的文件夹上单击创建应用程序),也会有不同的对象。这是因为.NET中的应用程序隔离单元是Application Domain,您可以将其描述为Windows进程中的软进程边界。

要回答评论中的问题,MS ASP.NET快速入门教程中的这个页面可能解释了这一点,并且直接来自马口:

  

Understanding Applications and State

引用:

  

每个ASP.NET Framework应用程序   Web服务器在a中执行   独特的.NET Framework应用程序   域,保证类   隔离(没有版本控制或命名   冲突),安全沙箱   (阻止访问某些机器   或网络资源)和静态   变量隔离。