web-dev-qa-db-ja.com

ASP NET MVC4とWebAPIを使用したカスタムhttphandlerとルートハンドラー

私はASPNETMVC4とWebApiに取り組んでいます。 webapiメソッドはモバイルデバイスによって使用されます。サービスを保護する必要があり、使用しているのは特定の方法でデータを暗号化することです。

ここで、コントローラーに到達する前に呼び出しを復号化する必要があります。復号化された情報が有効な場合は、通常どおりコントローラーに送信されます。そうでない場合は、ユーザーをエラーメソッドにルーティングします。

これを達成するための最善の策は、カスタムHttpHandlerとカスタムRouteHandlerだと思います。私はチュートリアルに従っています ここ

 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にブレークポイントを作成しましたが、ヒットしていません。何が欠けている可能性がありますか?これは正しい方法ですか?

11
polonskyg

まだ登録していない場合は、最初にハンドラーをglobal.asaxまたはweb.configファイルに登録する必要があります。

http://msdn.Microsoft.com/en-us/library/46c5ddfy(v = vs.100).aspx

7
trebuchet