SharePoint 2013 - 会话结束时的重定向

时间:2015-12-25 12:41:56

标签: c# asp.net asp.net-mvc asp.net-mvc-4 sharepoint

我创建了Global.asax文件并将其放入我的Web应用程序中,该应用程序适用于SharePoint 2013。 在Global.asax.cs文件中,我继承了SPHttpApplication类并重写 BeginRequest事件。它不起作用,SharePoint忽略Global.asax文件,或者我想念其他要添加的内容。 目标是在会话到期时创建重定向。我究竟做错了什么? 这是我的代码背后的代码:

namespace PhoenixHR.Global  
{
    public class PhenixHRHttpApplication : SPHttpApplication
    {
        public override void Init()  
        {      
            try  
            {  
                base.Init();  
                this.BeginRequest += new EventHandler(Moj_BeginRequest);  
            }  
            catch (Exception ex)  
            {  

            }  
        }

        private void Moj_BeginRequest(object sender, EventArgs e)  
        {  
            try  
            {  
             if (HttpContext.Current.Session["TPL"] == null)   
                Response.Redirect("~/PhoenixHR/start.aspx");  

            }  
            catch (Exception ex)  
            {  

            }  
        }
    }
}

Global.asax中

<%@ Assembly Name="Microsoft.SharePoint"%>
<%@ Application Language="C#" Inherits="PhoenixHR.Global.PhenixHRHttpApplication,PhoenixHR.Global,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a0bd8fabe3543dc0" %>

1 个答案:

答案 0 :(得分:0)

由于您的代码吞咽有异常可以证明更改无效吗?或者它是否每次请求都会引发异常并忽略它?

结合不同的事件你会更好。 HttpApplication类有很多可以绑定的事件,而BeginRequest在处理请求管道时非常早(第一次)。这将无法访问会话状态。我建议使用AcquireRequestState或PostAcquireRequestState。

为了使其工作,您需要创建一个HttpModule。

namespace PhoenixHR.Global
{
    public class SessionMissingRedirectHttpModule : IHttpModule
    {
        private const string LAYOUTS_SUBFOLDER = "/PhoenixHR.Global";
        private const string START_PAGE = "/start.aspx";

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            context.PostAcquireRequestState += context_PostAcquireRequestState;
        }

        void context_PostAcquireRequestState(object sender, EventArgs e)
        {
            // get required contexts
            SPHttpApplication application = (SPHttpApplication)sender;
            HttpContext context = application.Context;
            HttpSessionState session = context.Session;

            if (session == null)
                return;

            if (session["TPL"] != null)
                return;

            // get SharePoint context and current SPWeb.
            SPContext sharepointContext = SPContext.GetContext(context);
            SPWeb currentWeb = sharepointContext.Web;

            // build a url to the redirect page.
            string layoutsFolder =
                SPUtility.GetLayoutsFolder(currentWeb);
            string url = string.Format("{0}/{1}{2}{3}", currentWeb.Url, layoutsFolder, LAYOUTS_SUBFOLDER, START_PAGE);

            // prevent redirection loop
            if (context.Request.Url.AbsoluteUri.Equals(url, StringComparison.InvariantCultureIgnoreCase))
                return;

            SPUtility.Redirect(url, SPRedirectFlags.Trusted, context);
        }
    }
}

要注册HttpModule,您需要编辑将在其中运行的Web应用程序的web.config。

在/Configuration/system.webServer/modules路径中添加以下内容

<add name="SessionMissingRedirectHttpModule" type="PhoenixHR.Global.SessionMissingRedirectHttpModule, PhoenixHR.Global,Version=1.0.0.0,Culture=neutral,PublicKeyToken=a0bd8fabe3543dc0" />

对于所需应用程序页面的路径有一些最好的猜测,因此您可能需要更改变量以适应。