我们有一个现有的 .asmx Web 服务,它使用静态集合来存储表单处理过程中遇到的错误。不幸的是,正如您可能已经猜到的那样,这不是线程安全的。因此,我们正在寻找一种线程安全的方法来做到这一点。我宁愿避免在每次调用时来回传递错误对象。我目前已经重写它以使用 HttpContext.Current.Items 集合(启用了 Asp.Net 兼容性,会话也是如此),但想知道是否有人能想到更好的方法来实现它?.asmx Web 服务中是否有某种会话状态(如我不知道的存储)?
这是修复的当前实现。有没有更好的方法可以做到这一点?
public class ContextErrorCollection
{
public static void AddToErrorCollection(string error)
{
var nsec = ErrorCollection;
nsec.Add(error);
ErrorCollection = nsec;
}
public static List<string> ErrorCollection
{
get
{
var nsec = HttpContext.Current.Items["ErrorCollection"] as NonStaticErrorCollection ?? new NonStaticErrorCollection();
return nsec.ItemList;
}
set
{
var nsec = new NonStaticErrorCollection();
foreach (string error in value)
{
nsec.ItemList.Add(error);
}
HttpContext.Current.Items["ErrorCollection"] = nsec;
}
}
}
public class NonStaticErrorCollection
{
public string[] list()
{
return m_sList.ToArray();
}
public List<string> ItemList
{
get
{
if (m_sList == null) return new List<string>();
return m_sList;
}
}
private readonly List<string> m_sList = new List<string>();
}
//Calling Code
ContextErrorCollection.AddToErrorCollection(string.Format("Adding error number {0} to list...", i));
我知道依赖注入类型的解决方案会更好,但是 1) 确实没有足够的时间来实现它,并且 2) 这个应用程序将在大约 6 个月内被重写。
提前致谢!
-内森