Httphandler et routehandler personnalisés avec ASPNET MVC 4 et webapi
Je suis en train de travailler sur un ASPNET MVC 4 et WebApi. La webapi méthodes sera consommée par les appareils mobiles. Nous avons besoin de sécuriser les services et ce que nous utilisons consiste à chiffrer les données d'une certaine façon.
Maintenant, j'ai besoin de déchiffrer l'appel avant que le contrôleur est atteint. Si l'information déchiffrée est valide, elle doit continuer à le contrôleur comme d'habitude, si pas, je vais la route de l'utilisateur à une erreur de méthode.
Pour accomplir cela, je pense que le meilleur pari serait personnalisé HttpHandler et personnalisé RouteHandler. Je suis en suivant le tutoriel ici
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
});
}
}
Mondiale.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);
}
et dans Application_Start
RegisterRoutes(RouteTable.Routes);
Après le service est en place, j'ai créer un point d'arrêt dans ProcessRequest et il n'est pas d'être touché.
Que pourrait-il manquer? Est-ce la bonne façon de faire?
source d'informationauteur polonskyg
Vous devez vous connecter pour publier un commentaire.
Si vous ne l'avez pas encore, vous devez d'abord enregistrer le gestionnaire mondiale.asax ou votre site web.fichier de configuration.
http://msdn.microsoft.com/en-us/library/46c5ddfy(v=vs. 100).aspx