我如何在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。 解决方案如下(需要两个步骤):

  1. 在配置文件中将reliableSession设置为true

             
  2. 在合同界面中,将SessionMode属性设置为Required

     [ServiceContract(SessionMode = SessionMode.Required)] public interface IMyService{...} 

按照上面的步骤,问题将得到解决

您可以在WCF服务中激活ASP.NET兼容模式,并具有ASP.NET会话和上下文的所有好处。

将此属性添加到WCF类定义:

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 

并在您的web.config中: