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");
}
我的问题是当多个客户端访问该服务时,每个客户端都会访问最后一个设置会话。会话不是基于浏览器请求而不是识别客户端。哪个客户端发送了哪个请求。我该怎么做才能使它们特定于每个客户。意味着每个客户都必须有自己的会话。
请帮忙
答案 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或用户凭据,并在每个请求中将它们传达给服务器。