0

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");
        }

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

请帮忙

4

1 回答 1

1

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

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

由于您可以访问服务实现,因此最简单的解决方案可能是将会话标识符 (a 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 或用户凭据,并在每个请求中将它们传达给服务器。

于 2013-01-04T11:16:16.817 回答