asp.net mvc - net - Redirigir a una acción desde Application_BeginRequest en global.asax
mvc asp.net c# (8)
Además de las formas ya mencionadas. Otra forma es usar URLHelper, que utilicé en un escenario una vez que ocurrió el error y el usuario debe ser redirigido a la página de inicio de sesión:
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"));
}
}
En mi aplicación web estoy validando la url de glabal.asax. Quiero validar la url y necesito redirigir a una acción si es necesario. Estoy usando Application_BeginRequest para capturar el evento de solicitud.
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)
}
}
¿O hay alguna otra forma de validar cada url al obtener solicitudes en mvc y redirigir a una acción si es necesario?
Lo hago así:
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();
De esta manera, ajusta el contexto de la solicitud entrante y lo redirige a otro lugar sin redirigir al cliente. Por lo tanto, la redirección no activará otra BeginRequest en global.asax.
Prueba esto:
HttpContext.Current.Response.Redirect("...");
Puedes probar con esto:
Context.Response.Redirect ();
No estoy seguro.
Tenía una antigua aplicación de formularios web que tenía que convertir a MVC 5 y uno de los requisitos era admitir posibles enlaces .aspx {old_form}. En Global.asax Application_BeginRequest configuré una instrucción de cambio para manejar las páginas antiguas para redirigir a las nuevas y evitar el posible bucle no deseado a la verificación de ruta de inicio / predeterminada para ".aspx" en la URL sin formato de la solicitud.
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;
}
}
Todo lo anterior no funcionará, estará en el bucle de ejecutar el método Application_BeginRequest
.
Necesitas usar
HttpContext.Current.RewritePath("Home/About");
Utilice el siguiente código para redireccionar
Response.RedirectToRoute("Default");
"Por defecto" es el nombre de la ruta. Si desea redirigir a cualquier acción, simplemente cree una ruta y use ese nombre de ruta.
Response.RedirectToRoute(
new RouteValueDictionary {
{ "Controller", "Home" },
{ "Action", "TimeoutRedirect" }} );