问题是包含子目录的本地目录,每个子目录都有多个zip文件。我们无法更改系统外部的链接,但现在必须将它们重新路由到S3。该应用程序基于ASP.NET MVC 5构建。
建议的解决方案(我正在尝试): 捕获/directory/subdirectory/xyz.zip的所有入站请求,并将它们重定向到MVC控制器操作,以便从S3发送适当的文件。
结构:
root/DIRECTORY/*subdirectories/*.zip
网址示例:
www.somewhere.com/Packages/{Guid}/{Guid}-IDENTIFIER.zip
添加了新的控制器包
添加了以下路线
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抛出错误。
答案 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)