gpt4 book ai didi

asp.net - 使用 ASP.NET 路由来提供静态文件

转载 作者:行者123 更新时间:2023-12-02 09:01:51 25 4
gpt4 key购买 nike

可以使用 ASP.Net 路由(不是 MVC)来提供静态文件吗?

假设我要路由

http://domain.tld/static/picture.jpg

http://domain.tld/a/b/c/picture.jpg

我想动态地执行它,因为重写的 URL 是动态计算的。我无法一劳永逸地设置静态路由。

无论如何,我可以创建这样的路线:

routes.Add(
"StaticRoute", new Route("static/{file}", new FileRouteHandler())
);

FileRouteHandler.ProcessRequest方法中,我可以将/static/picture.jpg的路径重写为/a/b/c/picture.jpg。然后我想为静态文件创建一个处理程序。 ASP.NET 使用 StaticFileHandler 来实现此目的。不幸的是,这个类是内部的。我尝试使用反射创建处理程序,它确实有效:

Assembly assembly = Assembly.GetAssembly(typeof(IHttpHandler));
Type staticFileHandlerType = assembly.GetType("System.Web.StaticFileHandler");
ConstructorInfo constructorInfo = staticFileHandlerType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
return (IHttpHandler) constructorInfo.Invoke(null);

但是使用内部类型似乎不是正确的解决方案。另一种选择是实现我自己的 StaticFileHandler,但正确执行(支持范围和 etag 等 HTTP 内容)并非易事。

我应该如何在 ASP.NET 中处理静态文件的路由?

最佳答案

为什么不使用 IIS 来执行此操作?您可以创建一个重定向规则,将第一个路由的任何请求在到达您的应用程序之前指向第二个路由。因此,这将是一种更快的重定向请求的方法。

假设您有 IIS7+,您会执行类似的操作...

<rule name="Redirect Static Images" stopProcessing="true">
<match url="^static/?(.*)$" />
<action type="Redirect" url="/a/b/c/{R:1}" redirectType="Permanent" />
</rule>

或者,如果您不需要重定向,按照@ni5ni6的建议:

<rule name="Rewrite Static Images" stopProcessing="true">
<match url="^static/?(.*)$" />
<action type="Rewrite" url="/a/b/c/{R:1}" />
</rule>

为 @RyanDawkins 编辑 2015 年 6 月 17 日:

如果您想知道重写规则的位置,这里是其在 web.config 文件中的位置图。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<!-- rules go below -->
<rule name="Redirect Static Images" stopProcessing="true">
<match url="^static/?(.*)$" />
<action type="Redirect" url="/a/b/c/{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

关于asp.net - 使用 ASP.NET 路由来提供静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1149750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com