e.g。我在/Content/static/home.html
的服务器上有一个文件。我希望能够向/Content/v/1.0.0.0/static/home.html
发出请求(用于版本控制),并让它重写url,以便使用OWIN中间件访问正确URL的文件。
我目前正在使用URL重写模块(IIS扩展),但我希望在OWIN管道中使用它。
答案 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。