C# 更改代码中的Membership.ApplicationName-线程安全
对于C# 更改代码中的Membership.ApplicationName-线程安全,c#,asp.net,iis,thread-safety,C#,Asp.net,Iis,Thread Safety,对于Membership.ApplicationName属性(适用于asp.net成员资格提供程序),它警告说,尽管可以在代码中更改Membership.ApplicationName,但ApplicationName属性对于多次写入而言不是线程安全的,更改ApplicationName属性值可能会导致应用程序的多个用户出现意外行为。因此,他们建议避免将其用于“web应用程序” 这是因为默认的SqlMembershipProvider是作为单例编写的。但我的问题是:如果我的应用程序进程中的所有线
Membership.ApplicationName
属性(适用于asp.net成员资格提供程序),它警告说,尽管可以在代码中更改Membership.ApplicationName
,但ApplicationName属性对于多次写入而言不是线程安全的,更改ApplicationName属性值可能会导致应用程序的多个用户出现意外行为。因此,他们建议避免将其用于“web应用程序”
这是因为默认的SqlMembershipProvider
是作为单例编写的。但我的问题是:如果我的应用程序进程中的所有线程都将成员身份.ApplicationName
设置为相同的内容,可以吗
我正在考虑在我的IIS盒上安装多个应用程序,每个应用程序都有各自的应用程序池。我想将它们指向相同的位置,但根据主机名,将应用程序提供程序设置为不同的内容。这不是很好吗?它可能不是线程安全的操作,但不是每个应用程序池都有自己的进程,因此也有自己的SqlMembershipProvider
实例吗?因此,每个试图为给定的SqlMembershipProvider
实例设置Membership.ApplicationName
的线程都会尝试将其设置为相同的内容(适用于该主机名的提供程序)。还是我遗漏了什么
我想主要的问题是,所有asp.net应用程序都共享一个
SqlMembershipProvider
,还是为每个应用程序池进程创建一个单独的提供程序?每个应用程序池都有自己的成员资格。ApplicationName
,这样您就安全了
对于SQL成员资格提供程序,同样适用。因为每个站点都在自己的应用程序池中,所以它们是不同的、独立的
事实上,即使在同一个应用程序池中,但如果您有单独的ASP.NET应用程序(即,您为每个应用程序单击文件夹上的“创建”应用程序),也会有不同的对象。这是因为.NET中的应用程序隔离单元是Windows进程中的软进程边界
要回答您评论中的问题,MS ASP.NET快速入门教程的这一页可能解释了这一点,并且是直接从马匹口中说出来的:
引述:
上的每个ASP.NET Framework应用程序
Web服务器是在
独特的.NET Framework应用程序
域,它保证类
隔离(无版本控制或命名)
冲突),安全沙箱
(防止进入某些机器)
或网络资源)和静态
变量隔离
谢谢,凯文。。。我真的很想得到这个答案。:-)我不想质疑你的专业知识,但你能给我指一下任何明确说明这一点的网页(最好是MS写的)?如果能从真正权威的来源得到它,那就太好了。我假设是这样的,但正如我所提到的,我不认为
成员资格上的MSDN页面。ApplicationName
非常清楚地描述了这种情况。Kev:哪种情况回避了这个问题,为什么在Membership.ApplicationName MSDN页面上会出现可怕的“警告”?至少应该提到的是,您实际上可以非常轻松地分离SqlMembershipProvider的这些实例。@Jez-Ok…ApplicationName是一个静态值,这意味着它是整个应用程序的全局值(在其自己的应用程序域中运行)。如果你有两个要求。请求1从设置ApplicationName开始,做一些工作,也许代码中有一个较长的运行操作(您调用webservice),然后在读取ApplicationName的某个类上调用一个方法。请求2出现并将ApplicationName设置为不同的值,而请求1正在等待长时间运行的操作的结果..boom!。这就是为什么你需要小心谨慎。但是…@Jez-…这一切都发生在一个单独的ASP.NET应用程序中,该应用程序在应用程序域中隔离。设置此静态值不会影响其他应用程序中托管的ASP.NET应用程序(即使在同一工作进程中)。@Jez-它是基本的.NET 101。静态值仅对应用程序域是全局的。应用程序池可以运行多个ASP.NET应用程序(每个应用程序都在其自己的应用程序域中运行)。相信我,我每天都会看到这一点(我是一个web主机的ASP.NET托管工程师),因为我们在每个应用程序池中运行多个站点。由于应用程序域隔离,我们的客户在使用成员资格提供商时不会践踏彼此的全局静态。