变量生命周期或范围问题?

时间:2013-12-26 16:45:41

标签: vb.net wcf

我正在使用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函数,那么它可以正常工作 - 但这不是我的实际应用程序将如何工作。

1 个答案:

答案 0 :(得分:1)

实际上,这可能是配置问题。在WCF中,您可以使用配置属性强制实施Web Service实例的生命周期。我想ServiceBehaviorAttribute的{​​{3}}属性将是您正在寻找的配置选项。它从InstanceContextMode获得价值。

使用下一个配置会实例化服务每次通话。这将导致每个变量在每次新呼叫时重置其值。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 

使用下一个配置只会一次实例化服务对象。我想这会在服务的连续调用之间保留变量值。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

希望我帮忙!