Я должен перенаправить любые запросы на канонические URL.Чтобы решить эту задачу, я использую производный ActionFilterAttribute, как показано ниже:
public class CheckToRedirectFilterAttribute : ActionFilterAttribute
{
public bool ExactUrl { get; set; } = true;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
ActionResult redirect = filterContext.RouteData.RedirectToNewMap();
if (redirect == null && this.ExactUrl) {
var urlHelper = new UrlHelper(filterContext.RequestContext);
var routeValues = filterContext.RouteData.Values;
foreach (var a in filterContext.ActionParameters)
{
if (!routeValues.ContainsKey(a.Key))
routeValues.Add(a.Key, a.Value);
}
var canonicUrl = urlHelper.Action(filterContext.ActionDescriptor.ActionName, filterContext.ActionDescriptor.ControllerDescriptor.ControllerName, filterContext.RouteData.Values);
if (filterContext.HttpContext.Request.RawUrl.ToLower() != canonicUrl)
redirect = new RedirectResult(canonicUrl.ToLower());
}
if (redirect != null)
{
filterContext.Result = redirect;
}
}
}
А затем я использую этот атрибут в методах действия:
public class HomeController : Controller
{
[CheckToRedirectFilter]
public ActionResult Index()
{
return View();
}
}