2017-02-15 2 views
0

У меня есть пользовательский класс маршрутизации, которые я добавил к RouteConfigMVC пользовательских маршрутизации только для GET запросы

public static class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.Add(new CustomRouting()); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Класс CustomRouting выглядит следующим образом:

public class CustomRouting : RouteBase 
{ 
    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var requestUrl = httpContext.Request?.Url; 
     if (requestUrl != null && requestUrl.LocalPath.StartsWith("/custom")) 
     { 
      if (httpContext.Request?.HttpMethod != "GET") 
      { 
       // CustomRouting should handle GET requests only 
       return null; 
      } 

      // Custom rules 
      // ... 
     } 
     return null; 
    } 
} 

По существу я хочу обрабатывать запросы, перейдите на путь /custom/* с моими собственными правилами.

Но: Запросы, которые не являются «GET», не должны обрабатываться с помощью моих пользовательских правил. Вместо этого я хочу удалить сегмент /custom в начале пути , а затем, чтобы MVC продолжал работу с остальной частью маршрутизации, настроенной в RouteConfig.

Как я могу это достичь?

ответ

1

Вы можете начать путем фильтрации "обычай" префиксами запросы в HttpModule

HTTP Handlers and HTTP Modules Overview

Пример:

public class CustomRouteHttpModule : IHttpModule 
{ 
    private const string customPrefix = "/custom"; 

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

    private void BeginRequest(object sender, EventArgs e) 
    { 
     HttpContext context = ((HttpApplication)sender).Context; 
     if (context.Request.RawUrl.ToLower().StartsWith(customPrefix) 
     && string.Compare(context.Request.HttpMethod, "GET", true) == 0) 
     { 
      var urlWithoutCustom = context.Request.RawUrl.Substring(customPrefix.Length); 
      context.RewritePath(urlWithoutCustom); 
     } 
    } 

    public void Dispose() 
    { 
    } 
} 

Тогда вы можете иметь ваши маршруты для "пользовательских" URL

routes.MapRoute(
     name: "Default", 
     url: "custom/{action}/{id}", 
     defaults: new { controller = "Custom", action = "Index", id = UrlParameter.Optional } 
    ); 

Примечание: не забудьте зарегистрировать свой HttpModule в ваш web.config

<system.webServer> 
    <modules> 
    <add type="MvcApplication.Modules.CustomRouteHttpModule" name="CustomRouteModule" /> 
    </modules> 
</system.webServer> 
+0

Отличная идея. Спасибо! – Sandro

Смежные вопросы