例如,我有一个文件位于服务器上/Content/static/home.html
。我希望能够向/Content/v/1.0.0.0/static/home.html
(版本控制)发出请求,并让它重写 url,以便它使用 OWIN 中间件在正确的 url 访问文件。
我目前正在使用 URL 重写模块(一个 IIS 扩展),但我想在 OWIN 管道中进行这项工作。
例如,我有一个文件位于服务器上/Content/static/home.html
。我希望能够向/Content/v/1.0.0.0/static/home.html
(版本控制)发出请求,并让它重写 url,以便它使用 OWIN 中间件在正确的 url 访问文件。
我目前正在使用 URL 重写模块(一个 IIS 扩展),但我想在 OWIN 管道中进行这项工作。
我找到了使用Microsoft.Owin.StaticFiles
nuget 包的解决方案:
首先确保这是在您的 Web 配置中,以便将静态文件请求发送到 OWIN:
<system.webServer>
...
<modules runAllManagedModulesForAllRequests="true"></modules>
...
</system.webServer>
然后在您的启动配置方法中,添加以下代码:
// app is your IAppBuilder
app.Use(typeof(MiddlewareUrlRewriter));
app.UseStaticFiles();
app.UseStageMarker(PipelineStage.MapHandler);
这是 MiddlewareUrlRewriter:
public class MiddlewareUrlRewriter : OwinMiddleware
{
private static readonly PathString ContentVersioningUrlSegments = PathString.FromUriComponent("/content/v");
public MiddlewareUrlRewriter(OwinMiddleware next)
: base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
PathString remainingPath;
if (context.Request.Path.StartsWithSegments(ContentVersioningUrlSegments, out remainingPath) && remainingPath.HasValue && remainingPath.Value.Length > 1)
{
context.Request.Path = new PathString("/Content" + remainingPath.Value.Substring(remainingPath.Value.IndexOf('/', 1)));
}
await Next.Invoke(context);
}
}
例如,这将允许 GET 请求/Content/v/1.0.0.0/static/home.html
在/Content/static/home.html
.
更新:app.UseStageMarker(PipelineStage.MapHandler);
在其他方法之后
添加,app.Use
因为它需要使这项工作。http://katanaproject.codeplex.com/wikipage?title=Static%20Files%20on%20IIS
从理论上讲,您可以使用UseStaticFiles
选项而不是单独的 UrlRewriter 中间件来执行此操作:
string root = AppDomain.CurrentDomain.BaseDirectory;
var staticFilesOptions = new StaticFileOptions();
staticFilesOptions.RequestPath = new PathString("/foo");
staticFilesOptions.FileSystem =
new PhysicalFileSystem(Path.Combine(root, "web"));
app.UseStaticFiles(staticFilesOptions);
但是请参阅这个问题,因为它目前似乎不起作用。
现在这里有一个 Owin.UrlRewrite 项目:https ://github.com/gertjvr/owin.urlrewrite
它在语法上基于 Apache mod_rewrite。