WCF会话不是特定于特定用户的

时间:2013-01-04 10:59:55

标签: wcf wcf-sessions

WCF功能

    public void SetSession(string name)
    {
            HttpContext.Current.Session["abc"]=name;
    }
    public string GetSession(string name)
    {
            return HttpContext.Current.Session["abc"].ToString();
    }

代理

     using (ServiceReference1.BlackjackClient proxy = new ServiceReference1.BlackjackClient())
        {
            proxy.SetSession("Hello");
        }

我的问题是当多个客户端访问该服务时,每个客户端都会访问最后一个设置会话。会话不是基于浏览器请求而不是识别客户端。哪个客户端发送了哪个请求。我该怎么做才能使它们特定于每个客户。意味着每个客户都必须有自己的会话。

请帮忙

1 个答案:

答案 0 :(得分:1)

服务无法知道哪个客户端正在调用该服务。常规asp.net使用Session使用cookie,它标识每个请求并使一些内部voodoo将请求映射到正确的会话。

在您的情况下,您必须使用来自客户端的登录来确保服务可以识别请求,但这不会自动解决问题。

由于您可以访问服务实现,因此最简单的解决方案可能是在客户端中存储会话标识符(Guid),然后将此请求发送到Web服务,从而更改

    public void SetSession(string name)
    {
            HttpContext.Current.Session["abc"]=name;
    }
    public string GetSession(string name)
    {
            return HttpContext.Current.Session["abc"].ToString();
    }

类似

public void SetSession(string name, Guid sessionId)
{
        HttpContext.Current.Session[sessionId + "_abc"]=name;
}
public string GetSession(string name, Guid sessionId)
{
        return HttpContext.Current.Session[sessionId + "_abc"].ToString();
}

虽然修改这样的方法签名是相当丑陋的,但想法是,客户端帮助服务器识别调用者,从而识别会话。

使用传输协议来识别调用者会更清晰,因此如果要创建HTTP服务,可以使用一些http头(可能是授权)来包含会话标识符。如果您使用SOAP,则邮件头可能包含相同的信息。

会话标识符也可以通过名为Guid CreateSession()的新方法在服务中创建。但也可以在客户端创建Guid。

但是:您需要在客户端中存储一些唯一的会话ID或用户凭据,并在每个请求中将它们传达给服务器。