Tôi đang làm việc trên ASPNET MVC 4 và WebApi. Các phương pháp webapi sẽ được các thiết bị di động tiêu thụ. Chúng ta cần phải bảo mật các dịch vụ và những gì chúng ta đang sử dụng là mã hóa dữ liệu theo một cách cụ thể nào đó.Tuỳ chỉnh httphandler và routehandler với ASPNET MVC 4 và webapi
Bây giờ, tôi cần phải giải mã cuộc gọi trước khi đạt được bộ điều khiển. Nếu thông tin được giải mã là hợp lệ, nó sẽ tiếp tục điều khiển như bình thường nếu không, tôi sẽ định tuyến người dùng đến một số phương pháp lỗi.
Để thực hiện điều này, tôi nghĩ rằng đặt cược tốt nhất sẽ là tùy chỉnh HttpHandler và tùy chỉnh RouteHandler. Tôi đang theo hướng dẫn 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);
}
và trong Application_Start
RegisterRoutes(RouteTable.Routes);
Sau khi dịch vụ là lên, tôi tạo ra một breakpoint trong ProcessRequest và nó không bị đánh trúng. Điều gì có thể bị thiếu? Đây có phải là cách làm đúng không?
Bạn đang sử dụng phương pháp sai. Bạn nên sử dụng ActionFilters và/hoặc ModelBinders. – SLaks
Nhưng tôi đang sử dụng webapi, tôi không có hành động, phải không? Và Tại sao ActionFilter là một cách tiếp cận tốt hơn ở đây? – polonskyg
ActionFilter sẽ tốt miễn là bảo mật/ủy quyền được xử lý trước đó. ActionFilter là HttpHandler mới để sửa đổi yêu cầu trước khi gọi vào bộ điều khiển. – joezen777