作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
可以使用 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/
我是一名优秀的程序员,十分优秀!