10

Pracuję na ASPNET MVC 4 i WebApi. Metody webapi zostaną wykorzystane przez urządzenia mobilne. Musimy zabezpieczyć usługi, a to, czego używamy, polega na szyfrowaniu danych w pewien szczególny sposób.Niestandardowe httphandler i routehandler z ASPNET MVC 4 i webapi

Teraz potrzebuję odszyfrować połączenie, zanim sterownik zostanie osiągnięty. Jeśli informacja odszyfrowana jest ważna, powinna być kontynuowana do kontrolera, jak zwykle, jeśli nie, poprowadzę użytkownika do jakiejś metody błędu.

Aby osiągnąć ten cel, uważam, że najlepszym wyborem będzie niestandardowy HttpHandler i niestandardowy RouteHandler. Obserwuję samouczka 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); 
     } 

iw Application_Start

RegisterRoutes(RouteTable.Routes); 

Po usługa jest gotowy, tworzę przerwania w ProcessRequest i to nie jest trafiony. Czego może brakować? Czy to jest właściwy sposób robienia tego?

+0

Podejmujesz niewłaściwe podejście. Powinieneś użyć ActionFilters i/lub ModelBinders. – SLaks

+3

Ale używam webapi, nie mam akcji, mam? A dlaczego ActionFilter jest tu lepszym rozwiązaniem? – polonskyg

+0

Akcja ActionFilter byłaby dobra tak długo, jak długo ochrona/autoryzacja jest obsługiwana wcześniej. ActionFilter jest nowym HttpHandler do modyfikowania żądania przed wywołaniem do kontrolera. – joezen777

Odpowiedz

Powiązane problemy