ASP.NET MVC Route: bypass staticfile handler for path

后端 未结 2 1437
感动是毒
感动是毒 2020-12-06 04:50

I\'ve been googling and tinkering for a couple hours and haven\'t really made much progress, so hopefully someone here can help.

I\'m trying to get all requests to a

相关标签:
2条回答
  • 2020-12-06 05:15

    There are a couple options here.

    http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

    If you really want all requests running through the asp.net pipe then you need.

    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    

    Update

    Another option, especially if your need to bypass the static handler is constrained to a subset of your site, is to use the following

      <add name="ApiURIs-ISAPI-Integrated-4.0"
         path="/subdirectory/*"
         verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
    

    Considering how on mvc sites, most static files are handled from a couple well known directories, this is a better option.

    0 讨论(0)
  • 2020-12-06 05:39

    The best solution for this is probably to use a URL Rewriter to proxy the requests from the original URL to an MVC friendly alternative.

    For example, say you need to be able to automatically load relative URLs in content served from a database.

    RewriteRule ^/load/(\d+)/rel(\?.*)? -   [L]
    RewriteRule ^/load/(\d+)/(.*)$  /load/$1/rel?path=$2    [P,QSA,L,NC]
    

    Those rules will let you set up two MVC routes:

    routes.MapRoute(
        "Load Item",
        "load/{itemId}",
        new { controller = "Load", action = "Index" }
        );
    
    routes.MapRoute(
        "Load Relative Item",
        "load/{itemId}/rel",   //?path=
        new { controller = "Load", action = "Relative" }
        );
    

    And then your action methods are straightforward:

     public ActionResult Index(int itemId) { ... }
    
     public FileStreamResult Relative(int itemId, string path) { ... }
    

    The first rewrite rule is there to prevent paths containing /rel from being rewritten; they're already in their final form. The second rewrite rule proxies (instead of redirecting) the request.

    e.g.

    /load/1234/file.xml
    

    becomes

    /load/1234/rel?path=file.xml
    

    Proxying the request instead of doing a client redirect enables nested relative paths to work as well (and hides the secret sauce from the end user.)

    0 讨论(0)
提交回复
热议问题