Csharp/C#教程:两个WCF方法之间的全局变量分享


两个WCF方法之间的全局变量

我在WCF服务中有两个方法说

Method1() { _currentValue = 10; } Method2() { return _currentValue; } 

我有一种情况,我需要在Method1()中设置一个值,并在Method2()中读取它。

我尝试使用static变量如public static int _currentValue ,我能够读取Method2()中Method1()中设置的值。

但问题是,我希望这个变量像每个请求的单独实例变量一样做出反应。 即,现在下面是问题

浏览器1:

  - Method1() is called => sets _currentValue = 10; - Method2() is called => returns _currentValue = 10; 

浏览器2:

  - Method2() is called => returns _currentValue = 10; 

实际上,值集是浏览器1是静态的,因此在浏览器2中检索相同的值。

我想要实现的是变量应该像每个请求的新实例一样(从每个浏览器调用时)。 在这种情况下我应该使用什么? 会话?

您将需要一些相关机制,因为您有两个完全不同的会话调用不同的方法。 所以我建议使用两个呼叫者都知道的私钥。

我有点不可能知道那个密钥是什么,因为我无法从你的问题中收集任何东西,所以只有你知道这一点,但简单的事实是你需要相关性。 现在,一旦你确定他们可以使用什么,你就可以做这样的事情。

 public class SessionState { private Dictionary Cache { get; set; } public SessionState() { this.Cache = new Dictionary(); } public void SetCachedValue(string key, int val) { if (!this.Cache.ContainsKey(key)) { this.Cache.Add(key, val); } else { this.Cache[key] = val; } } public int GetCachedValue(string key) { if (!this.Cache.ContainsKey(key)) { return -1; } return this.Cache[key]; } } public class Service1 { private static sessionState = new SessionState(); public void Method1(string privateKey) { sessionState.SetCachedValue(privateKey, {some integer value}); } public int Method2(string privateKey) { return sessionState.GetCachedValue(privateKey); } } 

听起来您可能需要为WCF服务使用每会话实例上下文模式。 这将允许您在每个会话的基础上维护状态,因此服务实例中的成员变量将在来自同一代理实例的方法调用之间保持不变。 由于每个用户都有自己的会话,因此服务实例的状态会因用户而异。

有关更多信息,请查看此文章: http : //msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2

您已将变量static ,这就是导致问题的原因。 static意味着您的类的每个实例都共享变量,但您真正需要的只是在方法之外声明的变量,如下所示:

 private int _currentValue; Method1() { _currentValue = 10; } Method2() { return _currentValue; } 

此变量将针对您的每个类实例单独进行修改 – 在给定用户的请求之间保留此值是一个单独的问题。 (会话是一种可能的解决方案。)

WCF提供了三种控制WCF服务实例的方法:

通过阅读本文,您将找到最佳解决方案

三种方式做WCF实例管理

看起来像一个旧线程,但如果有人仍然感兴趣,这可以通过只要求WCF运行您的服务的单个实例来实现。 将以下行(装饰器)添加到类的定义[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

如果您希望仅针对同一会话而不是跨客户端的行为,则可以通过以下服务行为将其标记为每个会话[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

另一个选项是每次调用,这是默认选项。 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

上述就是C#学习教程:两个WCF方法之间的全局变量分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1018107.html

(0)
上一篇 2022年1月3日
下一篇 2022年1月3日

精彩推荐