我正在使用WCF并拥有一个非常简单的WCF服务库和Windows应用程序。在服务库中,我有以下内容:
Public Class Service1
Implements IService1
Dim MyRandomNumber As Integer
Dim upperbound As Integer = 50
Dim lowerbound As Integer = 1
Public Function GetData(ByVal value As String) As String Implements IService1.GetData
Return String.Format("You entered: {0}", value)
End Function
Public Function SendMetrics() As Integer Implements IService1.SendMetrics
Return MyRandomNumber
End Function
Public Sub CreateRandomNumber() Implements IService1.CreateRandomNumber
MyRandomNumber = CInt(Math.Floor((upperbound - lowerbound + 1) * Rnd())) + lowerbound
End Sub
Public Function GetDataUsingDataContract(ByVal composite As CompositeType) As CompositeType Implements IService1.GetDataUsingDataContract
If composite Is Nothing Then
Throw New ArgumentNullException("composite")
End If
If composite.BoolValue Then
composite.StringValue &= "Suffix"
End If
Return composite
End Function
结束班
非常简单......我正在测试的是运行一个sub然后返回sub创建的值(主要是因为我的应用程序将进行一些发送和接收,我想测试运行子程序的能力和能够从服务中返回数据。)
现在......当我从我的用户窗体运行CreateRandomNumber然后随后从我的用户窗体调用SendMetrics时 - 我总是得到0. :(随机数的生命周期似乎即将到期。我不认为这是我的形式正在呼唤它..我有这个:
Public Class Form1
Dim client As New ServiceReference1.Service1Client
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim returnString As String
returnString = client.GetData(TextBox1.Text)
Label1.Text = returnString
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim returnString As Integer
returnString = client.SendMetrics()
TextBox2.Text = returnString
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
client.CreateRandomNumber()
End Sub
End Class
这对我来说似乎是对的。如果我将所有代码放入SendMetrics函数,那么它可以正常工作 - 但这不是我的实际应用程序将如何工作。
答案 0 :(得分:1)
实际上,这可能是配置问题。在WCF中,您可以使用配置属性强制实施Web Service实例的生命周期。我想ServiceBehaviorAttribute
的{{3}}属性将是您正在寻找的配置选项。它从InstanceContextMode获得价值。
使用下一个配置会实例化服务每次通话。这将导致每个变量在每次新呼叫时重置其值。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
使用下一个配置只会一次实例化服务对象。我想这会在服务的连续调用之间保留变量值。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
希望我帮忙!