从global.asax中的Application_BeginRequest重定向到某个操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从global.asax中的Application_BeginRequest重定向到某个操作相关的知识,希望对你有一定的参考价值。
在我的Web应用程序中,我正在验证来自global.asax的url。我想验证网址,如果需要,还需要重定向到某个操作。我正在使用Application_BeginRequest来捕获请求事件。
protected void Application_BeginRequest(object sender, EventArgs e)
{
// If the product is not registered then
// redirect the user to product registraion page.
if (Application[ApplicationVarInfo.ProductNotRegistered] != null)
{
//HOW TO REDIRECT TO ACTION (action=register,controller=product)
}
}
或者是否有任何其他方法来验证每个URL,同时在mvc中获取请求并在需要时重定向到操作
以上所有都不起作用你将在执行方法Application_BeginRequest
的循环中。
你需要使用
HttpContext.Current.RewritePath("Home/About");
使用以下代码进行重定向
Response.RedirectToRoute("Default");
“默认”是路由名称。如果要重定向到任何操作,只需创建路由并使用该路由名称。
除了已经提到的方式。另一种方法是使用URLHelper,我在场景中使用过一次错误,用户应该重定向到Login页面:
public void Application_PostAuthenticateRequest(object sender, EventArgs e){
try{
if(!Request.IsAuthenticated){
throw new InvalidCredentialException("The user is not authenticated.");
}
} catch(InvalidCredentialException e){
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
Response.Redirect(urlHelper.Action("Login", "Account"));
}
}
试试这个:
HttpContext.Current.Response.Redirect("...");
我是这样做的:
HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Home");
routeData.Values.Add("action", "FirstVisit");
IController controller = new HomeController();
RequestContext requestContext = new RequestContext(contextWrapper, routeData);
controller.Execute(requestContext);
Response.End();
这样,您可以包装传入的请求上下文并将其重定向到其他位置,而无需重定向客户端。因此重定向不会在global.asax中触发另一个BeginRequest。
Response.RedirectToRoute(
new RouteValueDictionary {
{ "Controller", "Home" },
{ "Action", "TimeoutRedirect" }} );
我有一个旧的Web表单应用程序,我必须转换为MVC 5,其中一个要求是支持可能的{old_form} .aspx链接。在Global.asax Application_BeginRequest中,我设置了一个switch语句来处理旧页面以重定向到新页面,并避免在请求的原始URL中可能不希望的循环到home / default路由检查“.aspx”。
protected void Application_BeginRequest(object sender, EventArgs e)
{
OldPageToNewPageRoutes();
}
/// <summary>
/// Provide redirects to new view in case someone has outdated link to .aspx pages
/// </summary>
private void OldPageToNewPageRoutes()
{
// Ignore if not Web Form:
if (!Request.RawUrl.ToLower().Contains(".aspx"))
return;
// Clean up any ending slasshes to get to the old web forms file name in switch's last index of "/":
var removeTrailingSlash = VirtualPathUtility.RemoveTrailingSlash(Request.RawUrl);
var sFullPath = !string.IsNullOrEmpty(removeTrailingSlash)
? removeTrailingSlash.ToLower()
: Request.RawUrl.ToLower();
var sSlashPath = sFullPath;
switch (sSlashPath.Split(Convert.ToChar("/")).Last().ToLower())
{
case "default.aspx":
Response.RedirectToRoute(
new RouteValueDictionary
{
{"Controller", "Home"},
{"Action", "Index"}
});
break;
default:
// Redirect to 404:
Response.RedirectToRoute(
new RouteValueDictionary
{
{"Controller", "Error"},
{"Action", "NotFound"}
});
break;
}
}
你可以尝试这个:
Context.Response.Redirect();
当然可以。
以上是关于从global.asax中的Application_BeginRequest重定向到某个操作的主要内容,如果未能解决你的问题,请参考以下文章
Global.asax中的Application_Error事件不执行
为啥我在 Global.asax.cs 中的 Application_BeginRequest 没有被自托管的 WCF 服务调用
无法中断 global.asax / Application_Start
ASP.NET MVC:如何在 Global.asax.cs 中的 Application_Start() 中检测浏览器宽度
asp.net html静态文件没有触发global.asax中的Application_BeginRequest事件的解决方法