2016-10-22 5 views
1

Ich erstelle eine ASP.NET MVC 5-Site mit einigen PDF-Dateien für registrierte Mitglieder. Nur eingeloggte Benutzer können sie über die Controller-Aktion herunterladen. Sie sind jedoch auch über ihre physische URI zugänglich. Das URL-Muster ist wie:Mein benutzerdefinierter Route-Handler funktioniert nicht

localhost: 00000/resfiles/filename.pdf

Um den Zugang zu beschränken, ich diese post folgte eine benutzerdefinierte Route-Handler zu erstellen, und ich möchte die Identität des Benutzers in die überprüfen Handler, um nicht autorisiertes Herunterladen zu verhindern.

Ich habe meine RouteConfig.cs als:

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" } 
     ); 
    } 
} 

und definiert eine PDFRouteHandler Klasse:

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

Und die 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; } 
     } 

    } 

} 

Gehen Sie auf die URL in meinem Browser: localhost: 42439/ResFiles/BauerContractReview_Feb2015.pdf

Die drei Haltepunkte in PDFHandler.cs werden nie erreicht. Was vermisse ich? Vielen Dank.

Antwort

0

Wenn Sie ".pdf" aus Ihrer URL entfernen, wird Ihr Code ausgeführt. Siehe auch this Artikel. Wenn Sie ".pdf" unterstützen möchten, müssen Sie IIS konfigurieren und Ihren Handler in web.config registrieren. Einzelheiten siehe Artikel this.

+0

Danke. Ich habe es gerade ausprobiert. Ich gehe zu: http: // localhost: 42439/ResFiles/BauerContractReview_Feb2015, und die Haltepunkte werden nicht getroffen, und ich bekomme "Die Ressource kann nicht gefunden werden." Fehler zurückgegeben. – VincentZHANG

Verwandte Themen