【发布时间】:2010-12-13 20:10:32
【问题描述】:
这应该是相当基本的,但假设我有一个公共属性作为我的 WCF 服务上的局部变量,我在一次调用服务中设置了它。有没有办法保留该数据以供再次调用该服务? (无需将数据写入 xml 或 db,并重新引用它或类似的东西)
从 Winform 执行调用:
Public Class ClientSideWinForm
Private proxy As ServiceReference.Client
Private Sub Client_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
proxy = New ServiceReference.Client
End Sub
Private Sub btnStartTests_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartTests.Click
addToTxtResults("Try Chk Program Valid...")
Try
addToTxtResults(proxy.RequestChkValidProgram("Some-serial-number")) 'returns true or false and instanciates the object server side
addToTxtResults(proxy.RequestFirstName()) ' returns nothing
Catch ex As Exception
addToTxtResults(ex.ToString)
End Try
End Sub
End Class
服务本身(有点笨拙,但行为仍然存在):
Public Class Service
Implements IService
Public Property X As String
Function RequestChkValidProgram(ByVal strSerialNumber As String) As Integer Implements IService.RequestChkValidProgram
X = "hello"
End Function
Function RequestFirstName() As String Implements IService.RequestFirstName
Return X
End Function
End Class
【问题讨论】:
-
看起来如果我将 InstanceContextMode 更改为 Single,则信息在调用之间仍然存在。谢谢大家。如果有人想详细说明为什么这可能是一个坏主意,我真的很想知道。再次,谢谢! StackOverflow 非常棒。
-
web 服务中的状态,一般来说,应该避免。您现在还需要互锁对您的状态的访问,以便两个调用不会相互覆盖。
-
@John Saunders:你有没有机会进一步描述如何互锁访问的链接?它是通过用 lock(this){ doStuff(); 包装代码来完成的吗? },使用 System.Threading.Interlock.Increment(counter);对于计数器,并在覆盖之前比较值?
-
以上任何一种。我只是说你需要防止同时修改对象。
标签: .net vb.net wcf web-services