2016-10-22 78 views
1

我正在构建一个ASP.NET MVC 5网站,一些注册成员的PDF文件,只有登录的用户可以通过控制器操作下载它们;但是,它们也可以通过它们的物理URI访问。 URL模式是这样的:我的自定义路由处理程序不起作用

本地主机:00000/resfiles/filename.pdf

为了限制访问,我跟着这个post创建一个自定义路由处理程序,我想验证用户的身份以防止未经授权的下载。

我有我的RouteConfig.cs为:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.Add("PDFRoute", new Route("ResFiles/{filename}", new PDFRouteHandler())); 

     routes.MapRoute(
      name: "ProductDetail", 
      url: "NewProduct/Detail/{prdId}", 
      defaults: new { controller = "NewProduct", action = "Detail", prdId = "" }, 
      namespaces: new[] { "Totara.Controllers" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      namespaces: new[] { "Totara.Controllers" } 
     ); 
    } 
} 

,并定义了PDFRouteHandler类为:

namespace Totara.RouteHandlers 
{ 
    public class PDFRouteHandler : IRouteHandler 
    { 
     public IHttpHandler GetHttpHandler(RequestContext requestContext) 
     { 
      return new PDFHandler(requestContext); 
     } 
    } 
} 

而且PDFHandler:在

namespace Totara.HttpHandlers 
{ 
    public class PDFHandler : IHttpHandler 
    { 
     public PDFHandler(RequestContext context) 
     { 
      ProcessRequest(context); // never reach here 
     } 

     private static void ProcessRequest(RequestContext requestContext) 
     { 
      var response = requestContext.HttpContext.Response; // never reach here 
      var request = requestContext.HttpContext.Request; 
      var server = requestContext.HttpContext.Server; 
      var requestFile = requestContext.RouteData.Values["filename"].ToString(); 
      var path = server.MapPath("~/ResFiles/"); 
     } 

     public void ProcessRequest(HttpContext context) 
     { 
      var test = "test"; // never reach here 
     } 

     public bool IsReusable 
     { 
      get { return false; } 
     } 

    } 

} 

转到我的网址浏览器:localhost:42439/ResFiles/BauerContractReview_Feb2015.pdf

PDFHandler.cs中的三个断点从未达到。我错过了什么?谢谢。

回答

0

如果您从您的URL中删除“.pdf”,您的代码将被执行。另见文章this。如果你想支持“.pdf”,那么你必须配置IIS并在web.config中注册你的处理程序。详情请参阅this文章。

+0

谢谢。我只是试了一下。我转到:http:// localhost:42439/ResFiles/BauerContractReview_Feb2015,并且断点没有命中,我得到“无法找到资源。”错误返回。 – VincentZHANG

相关问题