10

Я работаю над ASPNET MVC 4 и WebApi. Методы webapi будут потребляться мобильными устройствами. Нам необходимо защитить сервисы, и мы используем шифрование данных определенным образом.Пользовательский httphandler и routehandler с ASPNET MVC 4 и webapi

Теперь мне нужно расшифровать вызов до того, как контроллер достигнут. Если информация дешифрована действительна, она должна продолжаться до контроллера, как обычно, если нет, я буду маршрутизировать пользователя к некоторому методу ошибок.

Для этого я считаю, что лучшим вариантом будет пользовательский HttpHandler и пользовательский RouteHandler. Я следую учебному пособию here

public class MvcSecurityRouteHandler:IRouteHandler 
    { 
     public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      return new MvcSecurityHttpHandler(requestContext); 
     } 
    } 

public class MvcSecurityHttpHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState, IRouteHandler 
    { 
     public RequestContext RequestContext { get; set; } 

     public MvcSecurityHttpHandler(RequestContext requestContext) 
     { 
      this.RequestContext = requestContext; 
     } 

     public bool IsReusable 
     { 
      get { return true; } 
     } 

     public void ProcessRequest(HttpContext httpContext) 
     { 
      var controllerId = RequestContext.RouteData.GetRequiredString("controllerId"); 
      IController controller = null; 
      IControllerFactory factory = null; 
      try 
      { 
       factory = ControllerBuilder.Current.GetControllerFactory(); 
       controller = factory.CreateController(RequestContext, controllerId); 
       if (controller != null) 
       { 
        controller.Execute(RequestContext); 
       } 
      } 
      finally 
      { 
       factory.ReleaseController(controller); 
      } 

      //string originalPath = httpContext.Request.Path; 
      //HttpContext.Current.RewritePath(httpContext.Request.ApplicationPath, false); 
      //IHttpHandler httpHandler = new MvcHttpHandler(); 
      //httpHandler.ProcessRequest(HttpContext.Current); 
      //HttpContext.Current.RewritePath(originalPath, false); 
     } 

     public IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

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

      var defaults = new RouteValueDictionary 
       {{"controllerId", "Home"},{"action", "Index"},{"id", string.Empty}}; 

      var customRoute = new Route("{controllerId}/{action}/{id}", defaults, new MvcSecurityRouteHandler()); 
      routes.Add(customRoute); 

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

Global.asax.cs

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

      var defaults = new RouteValueDictionary 
       {{"controllerId", "Home"},{"action", "Index"},{"id", string.Empty}}; 

      var customRoute = new Route("{controllerId}/{action}/{id}", defaults, new MvcSecurityRouteHandler()); 
      routes.Add(customRoute); 
     } 

и в Application_Start

RegisterRoutes(RouteTable.Routes); 

После услуга, я создать контрольную точку в ProcessRequest и ему не попадает. Что может отсутствовать? Правильно ли это?

+0

Вы принимаете неправильный подход. Вы должны использовать ActionFilters и/или ModelBinders. – SLaks

+3

Но я использую webapi, у меня нет действий, не так ли? И почему ActionFilter - лучший подход здесь? – polonskyg

+0

ActionFilter был бы хорош до тех пор, пока безопасность/авторизация обрабатываются ранее. ActionFilter - это новый HttpHandler для изменения запроса до вызова в контроллер. – joezen777

ответ

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