Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改代码中的Membership.ApplicationName-线程安全_C#_Asp.net_Iis_Thread Safety - Fatal编程技术网

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托管工程师),因为我们在每个应用程序池中运行多个站点。由于应用程序域隔离,我们的客户在使用成员资格提供商时不会践踏彼此的全局静态。