将对本地目录中的静态文件的请求重定向到MVC Action

时间:2015-09-15 01:31:51

标签: c# asp.net-mvc

问题是包含子目录的本地目录,每个子目录都有多个zip文件。我们无法更改系统外部的链接,但现在必须将它们重新路由到S3。该应用程序基于ASP.NET MVC 5构建。

建议的解决方案(我正在尝试): 捕获/directory/subdirectory/xyz.zip的所有入站请求,并将它们重定向到MVC控制器操作,以便从S3发送适当的文件。

结构:

root/DIRECTORY/*subdirectories/*.zip 

网址示例:

www.somewhere.com/Packages/{Guid}/{Guid}-IDENTIFIER.zip
  1. 添加了新的控制器包

  2. 添加了以下路线

  3. routes.MapRoute(
                   "RedirectDownloads",
                    "{controller}/{key}/{zip}",
                    new { controller = "Packages", action = "Index"},
                    new
                    {
                        key = @"[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?",
                        zip = @"[a-fA-F0-9]{8}(?:-[a-fA-F0-9]{4}){3}-[a-fA-F0-9]{12}\-.*\.zip"
                    }
                    );
    

    由于这些是文件系统上的静态文件,显然没有被点击,所以我也尝试了下面的...

    <add name="Zips-ISAPI-Integrated-4.0" path="*.zip" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    

    但这导致IIS抛出错误。

1 个答案:

答案 0 :(得分:2)

在您的web.config中,找到<handlers/ >代码

添加:

<add name="zipThingy" path="*.zip" verb="GET" type="MikesProject.ZipThingy"/>  

然后添加这个类:

namespace MikesProject
{
    public class ZipThingy: IHttpHandler, IReadOnlySessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            var request = context.Request;
            var response = context.Response;
        }
    }
}

然后:
1.将直接重定向返回到S3 URL,如下所示:response.RedirectPermanent("http://S3.URL.ZIP");
2.您将逻辑放入ProcessRequest而不是您的控制器,它将从S3下载zip并返回文件,或者 2.让response返回重定向到控制器,传递相关数据。您可以获取如下文件名:Path.GetFileName(context.Request.PhysicalPath)