如何使用OWIN中间件重写版本化的URL以请求静态文件?

时间:2014-07-07 20:12:49

标签: c# owin owin-middleware

e.g。我在/Content/static/home.html的服务器上有一个文件。我希望能够向/Content/v/1.0.0.0/static/home.html发出请求(用于版本控制),并让它重写url,以便使用OWIN中间件访问正确URL的文件。

我目前正在使用URL重写模块(IIS扩展),但我希望在OWIN管道中使用它。

3 个答案:

答案 0 :(得分:10)

我找到了使用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);
    }
}

例如,这将允许/Content/v/1.0.0.0/static/home.html的GET请求在/Content/static/home.html检索文件。

<强>更新 在其他app.UseStageMarker(PipelineStage.MapHandler);方法之后添加app.Use,因为这需要使其工作。 http://katanaproject.codeplex.com/wikipage?title=Static%20Files%20on%20IIS

答案 1 :(得分:2)

理论上,您可以使用带有选项的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);

但请参阅this question,因为它目前似乎无效。

答案 2 :(得分:1)

现在有一个Owin.UrlRewrite项目:https://github.com/gertjvr/owin.urlrewrite

它在语法上基于Apache mod_rewrite。