C# HttpContext.Current.Items的替代方案
最近,我在我们的系统中发现了一个bug,其中dll中的一个属性是共享的。在ASP.Net的情况下,这会导致线程安全问题C# HttpContext.Current.Items的替代方案,c#,asp.net,static,thread-safety,httpcontext,C#,Asp.net,Static,Thread Safety,Httpcontext,最近,我在我们的系统中发现了一个bug,其中dll中的一个属性是共享的。在ASP.Net的情况下,这会导致线程安全问题 protected static object Data { get; set; } 为了用尽可能小的更改来解决这个问题,我交换了内部属性,以使用HttpContext.Current.Items来存储和检索值。这适用于我们的网站 但是,我们还有一个引用此dll的exe。当它运行时(显然)没有对HttpContext.Current的引用 是否有可供选择的对象可用于asp.n
protected static object Data { get; set; }
为了用尽可能小的更改来解决这个问题,我交换了内部属性,以使用HttpContext.Current.Items
来存储和检索值。这适用于我们的网站
但是,我们还有一个引用此dll的exe。当它运行时(显然)没有对HttpContext.Current
的引用
是否有可供选择的对象可用于asp.net和/或exe。如果有必要,我愿意使用分支逻辑来确定要命中哪个属性,只要我只需要更改这个属性(显然,两个属性都需要一个解决方案。因此
[ThreadStatic]
属性在这种情况下可能会有所帮助,但需要注意
Scott Hanselman就ThreadStatic
的使用写了一篇文章。特别是,这一部分是相关的:
当您在ASP.NET中操作时,不要在静态成员上添加[ThreadStatic]属性,因为您可能无法控制线程生命周期…您继承了一个工作线程。ThreadStatic为您提供线程本地存储,而不是HttpContext本地存储
基本上,由于(IIS)工作者有重用应用程序池中线程的倾向,因此通常不建议将此属性用于web进程
为了应用这一点,在保持Web请求的线程安全性的同时(并且仅涉及属性),您可以使用分支逻辑来确定要从哪些部分存储/检索数据:
[ThreadStatic]
private static object _data;
protected static object Data
{
get
{
if (HttpContext.Current != null)
return HttpContext.Current.Items[DataKey] as object;
else
return _data;
}
set
{
if (HttpContext.Current != null)
HttpContext.Current.Items[DataKey] = value;
else
_data = value;
}
}
因此,
[ThreadStatic]
属性在这种情况下可能会有所帮助,但它附带了一些警告
Scott Hanselman就ThreadStatic
的使用写了一篇文章。特别是,这一部分是相关的:
当您在ASP.NET中操作时,不要在静态成员上添加[ThreadStatic]属性,因为您可能无法控制线程生命周期…您继承了一个工作线程。ThreadStatic为您提供线程本地存储,而不是HttpContext本地存储
基本上,由于(IIS)工作者有重用应用程序池中线程的倾向,因此通常不建议将此属性用于web进程
为了应用这一点,在保持Web请求的线程安全性的同时(并且仅涉及属性),您可以使用分支逻辑来确定要从哪些部分存储/检索数据:
[ThreadStatic]
private static object _data;
protected static object Data
{
get
{
if (HttpContext.Current != null)
return HttpContext.Current.Items[DataKey] as object;
else
return _data;
}
set
{
if (HttpContext.Current != null)
HttpContext.Current.Items[DataKey] = value;
else
_data = value;
}
}
我找到了
[ThreadStatic]
属性。这对exe和Asp.Net调用方都有效吗?我找到了[ThreadStatic]
属性。这对exe和Asp.Net调用方都有效吗?