C# SharePoint 2013-会话结束时重定向
我创建了Global.asax文件,并将其放入在SharePoint 2013上运行的web应用程序中。 在Global.asax.cs文件中,我继承了SPHttpApplication类并重写了它 开始请求事件。它不起作用,SharePoint会忽略Global.asax文件,或者我错过了其他要添加的内容。 目标是在会话过期时创建重定向。我做错了什么? 这是我在代码隐藏中的代码:C# SharePoint 2013-会话结束时重定向,c#,asp.net,asp.net-mvc,asp.net-mvc-4,sharepoint,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Sharepoint,我创建了Global.asax文件,并将其放入在SharePoint 2013上运行的web应用程序中。 在Global.asax.cs文件中,我继承了SPHttpApplication类并重写了它 开始请求事件。它不起作用,SharePoint会忽略Global.asax文件,或者我错过了其他要添加的内容。 目标是在会话过期时创建重定向。我做错了什么? 这是我在代码隐藏中的代码: namespace PhoenixHR.Global { public class PhenixHRH
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" %>
当您的代码中出现一些异常时,您能证明更改不起作用吗?还是每次请求都会引发一个异常而忽略它 绑定到另一个事件会让您受益匪浅。HttpApplication类有很多可以绑定的事件,BeginRequest在处理请求管道的早期(首先)。这将无法访问会话状态。我建议使用AcquisiteRequestState或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" />
对于所需应用程序页面的路径,存在一些最佳猜测,因此您可能需要更改变量以适应。Hi Adam,空的try-catch块只是因为如果发生异常,我不想停止此应用程序的执行。加载应用程序时,不会发生任何事情。未执行该事件。不会执行此文件中的任何内容,它不会停止到任何断点。此文件似乎未被SharePoint使用或忽略。问题是,您的代码在添加事件绑定时不会抛出任何异常,但它将防止任何异常正确冒泡。更好的做法是在使用对象之前检查对象上的空引用,而不是全面尝试..catch.您应该能够在响应中添加一个标题,以证明所做的更改是否有效。如果(HttpContext.Current!=null&&HttpContext.Current.Response!=null)HttpContext.Current.Response.Headers.Add(“X-StackOverFlow”,Guid.NewGuid().ToString()),则将其放入Moj_BeginRequest方法
代码>然后,您可以使用诸如Fiddler之类的工具或大多数现代浏览器的开发工具来确认响应中是否存在标题。今晚我已经做了一个快速测试,您必须实现一个HttpModule才能做到这一点。global.asax在大多数情况下不允许您访问会话状态。我将尝试稍后发布一个回复,因为对我来说已经晚了,而且我明天很早就要开始了!这里是关于HttpModules的一些信息,在我回复之前,您可能会知道需要什么。更新了我的答案以包含一个HttpModule示例。我在我的dev farm上构建了一些类似的东西,它可以正常工作。