Я работаю над 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 и ему не попадает. Что может отсутствовать? Правильно ли это?
Вы принимаете неправильный подход. Вы должны использовать ActionFilters и/или ModelBinders. – SLaks
Но я использую webapi, у меня нет действий, не так ли? И почему ActionFilter - лучший подход здесь? – polonskyg
ActionFilter был бы хорош до тех пор, пока безопасность/авторизация обрабатываются ранее. ActionFilter - это новый HttpHandler для изменения запроса до вызова в контроллер. – joezen777