我如何在wcf服务中拥有会话ID
我正在编写一个具有多种方法的身份validation服务。此方法的一部分是ChangePassword。 我希望当任何机构想要更改密码时,请先登录系统。为此我想要一个会话ID并在更改传递之前检查它。
我怎么能这样做,并且会议时间有多长?
编辑1)
我编写这段代码,但每次我想要获取它的值时,我的会话都是null:
类:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class Service2 : IService2 { string result { // Store result in AspNet session. get { if (HttpContext.Current.Session["Result"] != null) return HttpContext.Current.Session["Result"].ToString(); return "Session Is Null"; } set { HttpContext.Current.Session["Result"] = value; } } public void SetSession(string Val) { result = Val; } public string GetSession() { return result; }
接口:
[ServiceContract(SessionMode = SessionMode.Required)] public interface IService2 { [OperationContract] void SetSession(string Val); [OperationContract] string GetSession(); }
web.config中
编辑2)我写了这段代码,但它不起作用:
private void button1_Click(object sender, EventArgs e) { MyService2.Service2Client srv = new MyService2.Service2Client(); textBox1.Text = srv.GetSession(); } private void button2_Click(object sender, EventArgs e) { MyService2.Service2Client srv = new MyService2.Service2Client(); srv.SetSession(textBox1.Text); textBox1.Clear(); }
每次我想获得Session值,我都会得到“Session Is Null”。为什么?
为了拥有SessionId,您必须具有启用会话的绑定。 例如, wsHttpBinding
。 在配置文件中,您应该具有以下内容:
在IMyService
接口中,您必须将SessionMode
属性设置为Required
,如下所示:
[ServiceContract(SessionMode = SessionMode.Required)] public interface IMyService { [OperationContract] AuthenticationData Authenticate(string username, string password); }
完成所有这些后,您可以像这样访问SessionId
:
var sessionId = OperationContext.Current.SessionId;
另一种方法是启用AspNetCompatibilityRequirements但是获得SessionId只是有点过分。
在WCF中使用wsHttpBinding时,您会发现OperationContext.Current.SessionId的值为null。 解决方案如下(需要两个步骤):
-
在配置文件中将reliableSession设置为true
-
在合同界面中,将SessionMode属性设置为Required
[ServiceContract(SessionMode = SessionMode.Required)] public interface IMyService{...}
按照上面的步骤,问题将得到解决
您可以在WCF服务中激活ASP.NET兼容模式,并具有ASP.NET会话和上下文的所有好处。
将此属性添加到WCF类定义:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
并在您的web.config中: