微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Silverlight的过期退出和WCF服务session失效的同步方案

 

Silverlight的过期退出和WCF服务session失效的同步方案。

分类: ASP.NET Silverlight,WPF 通信RPC/Remoting/Web Service/WCF

前边一篇文章中,说了一下WCF和Asp.net的session共享,现在实现Silverlight的过期退出和WCF服务session失效的同步方案。

Silverlight的bussiness模板中已经包含了超时认证的部分,现作为借鉴,实现了WCF服务端session失效和Silverlight过期的同步。

1. 在web.config中设置session过期的时间:

[html]  view plain copy print ?
  1. <sessionState  
  2.                       mode="InProc" stateConnectionString"tcpip=127.0.0.1:42424" cookieless="false" timeout="60"/>  
2. 在aspx的页面中读取其配置过期时间到silverlight中。

[csharp]  ?
    public partial class Default : System.Web.UI.Page  
  1.     {  
  2.         protected override void OnLoad(EventArgs e)  
  3.         {  
  4.             if (!User.Identity.IsAuthenticated)  
  5.             {  
  6.                 string url = Request.Url.ToString();  
  7.                 url = url.Replace("&""%26");  
  8. string urlBase64 = Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(url));  
  9. string urlRedirect = string.Format("{0}?ReturnUrl={1}", FormsAuthentication.LoginUrl, urlBase64);  
  10.                 Response.Redirect(urlRedirect);  
  11. return;  
  12.             }  
  13. else  
  14.             {  
  15.                 UserId = HttpContext.Current.User.Identity.Name; // 读取session过期时间  
  16. int formTimeOut =(int)FormsAuthentication.Timeout.TotalMinutes;  
  17.                 Timeout = HttpContext.Current.Session.Timeout >= formTimeOut  
  18.                               ? formTimeOut  
  19.                               : HttpContext.Current.Session.Timeout;  
  20. base.OnLoad(e);  
  21.         }  
  22. void Page_Load(object sender, EventArgs e)  
  23.         {  
  24.         }  
  25.   
  26. public string UserId { getset; }  
  27. int Timeout {     }  
3.把Timeout传人参数到silverlight端:

?@H_404_282@
    param name="initParams" value="userId=<%=UserId%>,timeOut=<%=Timeout%>"/>  
4.在silverlight中读取过期时间值,进行过期退出实现

?@H_404_282@
    private void Application_Startup(  
  1.   _timeOut = Convert.ToInt32(e.InitParams["timeOut"]);  
  2.  FormsWithTimeoutAuthentication formsWithTimeoutAuthentication = new FormsWithTimeoutAuthentication(_timeOut); // 短于服务端  
  3.  formsWithTimeoutAuthentication.EndLogin(true);  

formsWithTimeoutAuthentication 类得实现:

?@H_404_282@
    class FormsWithTimeoutAuthentication  
  1.  {  
  2.      private dispatcherTimer idleTimer;  
  3. int minutesIdle;  
  4. bool idle;  
  5. bool attached = false;  
  6. private CommonProxy.CommonServicesClient commomProxy = null;  
  7. public FormsWithTimeoutAuthentication()  
  8.          : this(20)  
  9.      { }  
  10. public FormsWithTimeoutAuthentication(int idleMinutes)  
  11.      {  
  12.          IdleMinutesBeforeTimeout = idleMinutes;  
  13.          idleTimer = new dispatcherTimer();  
  14.          idleTimer.Interval = TimeSpan.FromMinutes(1);  
  15.          idleTimer.Tick += new EventHandler(idleTimer_Tick);  
  16.      }  
  17. int IdleMinutesBeforeTimeout  
  18.      {  
  19.          get;  
  20. set;  
  21.      }  
  22. void  EndLogin(bool loginRes)  
  23. if (loginRes == true)  
  24.          {  
  25.              if (!attached) AttachEvents();  
  26.              minutesIdle = 0;  
  27.              idleTimer.Start();  
  28.          }  
  29. void  Endlogout()  
  30.          idleTimer.Stop();  
  31. void AttachEvents()  
  32.          attached = true;  
  33.          //Application.Current.RootVisual.MouseMove += new MouseEventHandler(RootVisual_MouseMove);  
  34.          Application.Current.RootVisual.KeyDown += new KeyEventHandler(RootVisual_KeyDown);  
  35.          Application.Current.RootVisual.MouseLeftButtonUp += new MouseButtonEventHandler(RootVisual_MouseLeftButtonUp);  
  36.          Application.Current.RootVisual.MouseRightButtonDown += new MouseButtonEventHandler(RootVisual_MouseRightButtonDown);  
  37.          Application.Current.RootVisual.MouseWheel += new MouseWheelEventHandler(RootVisual_MouseWheel);  
  38. void RootVisual_MouseWheel(         idle = false;  
  39. void RootVisual_MouseRightButtonDown(void RootVisual_MouseLeftButtonUp(void RootVisual_KeyDown(void RootVisual_MouseMove(void idleTimer_Tick(if (idle ==              minutesIdle += idleTimer.Interval.Minutes;  
  40. if (minutesIdle >= IdleMinutesBeforeTimeout)  
  41.              {  
  42.                  logout();  
  43.              }  
  44. else  
  45.              minutesIdle = 0;  
  46. void logout()  
  47.          Endlogout();  
  48. //这里是你自己的退出登录代码,我这里是调用WCF的配置的退出地址,退出界面,刷新页面而已  
  49.          commomProxy = new CommonServicesClient();  
  50.           
  51.          commomProxy.GetConfigValuebyConfigKeyCompleted += (sender, e) =>  
  52.                                                                {  
  53.                                                                    if(e.Error == null)  
  54.                                                                    {  
  55.                                                                        if (!string.IsNullOrEmpty(e.Result))  
  56.                                                                            HtmlPage.Window.Navigate(new Uri(  
  57.                                                                                                         e.Result,  
  58.                                                                                                         UriKind.  
  59.                                                                                                             Absolute));  
  60.                                                                    }  
  61.                                                                };  
  62.          commomProxy.GetConfigValuebyConfigKeyAsync("logoutRedirectUrl");  
  63.  }  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐