我们有一个类库项目,用于保存我们的基本数据定义、sql函数和泛型函数。这个类库用于或winform项目和我们的asp.net项目。
在其中一个类中,我们有通用函数设置和共享变量。
Public Class Generic
Public Shared CurrentDeviceUniqueIdentifier As String
Public Shared TimeDiffFromServer As Long
Public Shared myLogger As Logger
....
end Class
它们在类库中也可以在winform/asp.net项目中访问。
If Generic.myLogger IsNot Nothing Then Generic.myLogger.WriteLog(...)
这些共享变量并没有在winform项目中引起任何问题,因为这些变量只有一个实例,系统并没有任何问题。
但是asp.net项目在会话之间混淆了这些共享变量,因为它们是共享的。
我可以将类转换为模块,因为系统是用VB而不是C#设计的。但不确定这是否能解决问题。(应该)万一将来我们想转换成C#,这就行不通了。
但我很好奇,有没有其他方法可以绕过这个共享变量锁定到asp.net会话中的问题。
静态类和数据在ASP.NET会话之间共享。时期更改为Module
不会改变问题,因为Module
中的"所有东西"都是共享的。如果你想为每个会话拥有单独的实例,那么你必须使它们"不是Shared
",并更改代码以将实例存储在会话中:
Session("Logger") = new Logger()
据我所知,在ASP.NET中没有允许按会话单独共享类的"破解"。
简短的回答是否定的。
VB共享变量或C#静态变量是AppDomain范围的(出于实际目的,您可以将其视为进程范围的),因此您只有一个值。
要为不同的ASP.Net会话设置不同的值,必须将其放入会话字典中,这是无法解决的。
您可能还想了解线程问题。一般来说,ASP.Net是并发处理请求的,如果您有共享变量(即使在同一会话中),这些变量可能会被并发访问,并且您的代码需要是线程安全的。
现在我需要在类库中找到一个简单快速的解决方案。已将类转换为模块。从所有变量和函数中删除了所有共享(静态)代码。到目前为止,它在功能和编译方面都是一样的。我希望数据交叉也应该得到解决。我会密切关注日志,看看它是否会再次发生,但我怀疑它是否会发生。
我仍然更喜欢在winforms和asp.net中使用另一种方法,这样我们将来就可以转换为C#。
供参考代码的更改版本:
Public Module Generic
Public CurrentDeviceUniqueIdentifier As String
Public TimeDiffFromServer As Long
Public myLogger As Logger
....
end Class