asp.net - 作为单例的 Web 服务是否会导致不同用户出现问题?

标签 asp.net vb.net web-services

我正在开发一个使用 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/

相关文章:

asp.net - jQuery 渗透测试

jquery - ASP.NET MVC3 : ValidationType ModelClientValidationRule

javascript - 如何将事件从 VB.Net 类库/用户控件 (ActiveX) 提升到 JavaScript?

c# - vb.net中或命令的等效代码

android - 我应该使用什么来保护 REST 网络服务中的参数

c# - Web API 的静态 api key

c# - ASP.net Web 表单在哪里使用 UnitOfWork 模式处理实体上下文

c# - 需要 xpath 表达式来循环通过 xmldocument

objective-c - 从网页中提取文本并将其显示在ios上的textview中

c# - wcf服务回调异常的处理方法