2010-12-13 80 views
0

这应该是相当基本的,但是说我在我的WCF服务上有一个公共属性作为局部变量,并且我在一次调用该服务时设置了它。有没有办法保存这些数据,以便再次调用服务? (如果没有写入数据到XML或DB,并重新对其进行引用或类似的东西)在wcf调用之间保留对象?

执行从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 

服务本身(简单化了一点,但behaivor仍然存在):

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 
+0

看起来像是如果我将InstanceContextMode更改为单个信息在调用之间持续存在。谢谢大家。 如果有人想详细说明为什么这可能是一个坏主意,我真的很想知道。再次,谢谢! StackOverflow是相当惊人的。一般来说,应避免在Web服务中使用状态 – Kosko 2010-12-13 20:44:16

+0

。您现在还需要互锁访问您的状态,以便两个呼叫不会相互覆盖。 – 2010-12-14 01:21:05

+0

@John Saunders:你有任何一个链接可以进一步描述如何互锁访问吗?它是通过用lock(this)包装代码来完成的{doStuff(); },使用System.Threading.Interlock.Increment(counter);为计数器,并在覆盖它们之前比较值? – Kosko 2010-12-14 13:31:45

回答

1

如果我正确地理解了这个问题,那么服务调用之间的服务实现状态就会丢失。您应该考虑设置您的服务实现的InstanceContextMode ServiceBehavior--听起来它现在设置为PerCall,这样每个服务调用都会获得它自己的实例。 PerSessionSingle可能是更好的选择。

虽然我不一定同意@John Saunders这是一个糟糕的主意,但有关您想要完成的更多细节将会很有用。 :)

+0

我已经添加了一些小小的代码来澄清我在这里要做的事情。它看起来好像你有正确的解释。谢谢! – Kosko 2010-12-13 20:28:00

+0

@Kosko感谢您的阐述,但我们可能需要看看服务端实现(即包含不存在于调用之间的属性)以了解可能出错的想法。干杯。 – 2010-12-13 20:29:47

1

只要你有你的服务的一个实例,那么你可以从一个调用到下保存数据。你应该考虑告诉我们为什么你要这样做,因为这听起来像个坏主意。

+0

感谢您的快速回复。它是服务的单个实例,但在第二次调用时,该属性会重新设置为“Nothing”。至于推理,第一个调用是检查客户端的属性是否有效(例如序列号),并让服务知道它正在使用哪个客户端。接下来的电话将是检索有关该客户的信息,如名称,电话等基本信息) 我可以每次都传递序列号,但我认为只需要通过一次就可以了,并根据需要获取其他信息。 – Kosko 2010-12-13 20:17:40

+2

你怎么知道这是一个单一的实例?小心显示一些代码? – 2010-12-13 20:18:44

+0

同意。这听起来不对,你们都。 :) – 2010-12-13 20:19:56