我正在开发一个使用 UPS 运输网络服务的电子商务应用程序。我读过,创建一个单例是很好的做法,这样任何时候 Web 服务都只有一个实例。我的代码如下。
Public Class Ship
Private Shared sync As New Object()
Private Shared _Service As New ShipService
Public Shared ReadOnly Property Service As ShipService
Get
If _Service Is Nothing Then
SyncLock sync
If _Service Is Nothing Then
_Service = New ShipService
End If
End SyncLock
End If
Return _Service
End Get
End Property
Public Shared Function GetInstance() As ShipService
Return Service()
End Function
End Class
这里是使用它的一个片段。
Public Sub New(ByVal ToAddress As Address, ByVal WeightInLbs As String)
//Not relevant code
Ship.Service.UPSSecurityValue = Security
//More not relevant code
End Sub
Public Function ProcessShipment() As ShipmentResponse
Return Ship.Service.ProcessShipment(ShipmentRequest)
End Function
在上面的构造函数中,我必须设置服务的 UPSSecurityValue。然后稍后我将调用 ProcessShipment 函数。我的问题是;由于 Web 服务被视为单例,应用程序的不同实例是否可以共享相同的 UPSSecurityValue,并且它是否可以在我设置它和调用 ProcessShipment 之间发生变化?
最佳答案
就您正在执行的操作而言,在您调用 New 并设置安全值和实际处理货件之间,它肯定会发生变化。单例在您的应用程序的所有用户之间共享(在同一个 Web 应用程序中,也就是说,如果您的服务器上有此应用程序的多个副本,他们每个人都会使用自己的单例),因此所有用户都将共享相同的数据.
如果多个用户同时运行该应用程序(或者 User2 仅落后 1 毫秒):
User1 User2
New (sets security code)
New (sets security code)
ProcessShipment
ProcessShipment
两批货件都将使用 User2 的安全代码进行处理,这不是您想要的。安全地执行此操作的方法可能是在运送包裹时将安全性传递到函数中,然后立即使用它 - 如果您存储它以供以后使用,即使是稍后一条指令,您也正在为一场比赛做好准备用户互相读取数据的情况。
关于asp.net - 作为单例的 Web 服务是否会导致不同用户出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3101373/