【问题标题】:Preserve objects between wcf calls?在 wcf 调用之间保留对象?
【发布时间】: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


【解决方案1】:

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

虽然我不一定同意@John Saunders 的观​​点,即这是一个坏主意,但了解更多关于您要完成的工作的详细信息会很有用。 :)

【讨论】:

  • 我添加了一些代码来尝试澄清我在这里尝试做的事情。不过,您似乎确实有正确的解释。谢谢!
  • @Kosko 感谢您的详细说明,但我们可能需要查看服务端实现(即包含在调用之间不持久的属性的任何内容)以了解可能是什么出错了。干杯。
【解决方案2】:

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

【讨论】:

  • 感谢您的快速回复。它是服务的单个实例,但在第二次调用时,该属性被设置回“Nothing”。至于推理,第一个调用是检查客户端的属性是否有效(例如序列号),并让服务知道它正在使用哪个客户端。接下来的调用将是检索有关该客户的信息,基本信息,例如姓名,电话等)我可以每次都传递序列号,但我认为只需要传递一次会更好,并且根据需要获取其他信息。
  • 你怎么知道它是单实例?想展示一些代码吗?
  • 我已经编辑了原始问题(很差)以包含一些代码。感谢您的回复,如果还有其他内容可以帮助解决问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2011-08-07
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多