6

我在 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 中检索到相同的值。

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

4

5 回答 5

3

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

查看这篇文章了解更多信息:http: //msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2

于 2012-09-18T16:46:05.807 回答
3

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

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

public class SessionState
{
    private Dictionary<string, int> Cache { get; set; }

    public SessionState()
    {
        this.Cache = new Dictionary<string, int>();
    }

    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);
    }
}
于 2012-09-18T11:24:20.780 回答
2

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

private int _currentValue;

Method1() 
{ 
    _currentValue = 10; 
} 

Method2() 
{ 
    return _currentValue; 
} 

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

于 2012-09-18T11:18:18.417 回答
0

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

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

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

于 2013-04-20T08:16:44.577 回答
0

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

  • 每次通话
  • 会话
  • 单实例

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

WCF实例管理的三种方式

于 2013-03-14T07:55:07.380 回答