C# Owin仅为特定文件夹中的文件提供服务
所以我在玩Owin和Katana,我想在我的公用文件夹中提供静态文件 我有一个带有样式表的内容文件夹和一个脚本文件夹 我的创业:C# Owin仅为特定文件夹中的文件提供服务,c#,owin,static-files,katana,owin-middleware,C#,Owin,Static Files,Katana,Owin Middleware,所以我在玩Owin和Katana,我想在我的公用文件夹中提供静态文件 我有一个带有样式表的内容文件夹和一个脚本文件夹 我的创业: public void Configuration(IAppBuilder app) { #if DEBUG //when things go south app.UseErrorPage(); #endif // Remap '/' to '.\public\'. // Turn
public void Configuration(IAppBuilder app)
{
#if DEBUG
//when things go south
app.UseErrorPage();
#endif
// Remap '/' to '.\public\'.
// Turns on static files and public files.
app.UseFileServer(new FileServerOptions()
{
RequestPath = PathString.Empty,
FileSystem = new PhysicalFileSystem(@".\public"),
});
}
因此,如果我浏览到localhost:8861/I,我将转到我的公用文件夹中的index.html文件。没关系。
但我也可以浏览到我想要阻止的localhost:8861/Content/style.css。用户需要的所有内容都应该可以在公用文件夹中访问。其余的都应该封锁
如何实现此目的?文件服务器的配置正确,不允许访问其他文件夹。我已经在测试OWIN自宿主项目中检查了它,它按预期工作,只能访问公用文件夹。我假设您使用IIS托管OWIN应用程序(因此您的应用程序不是自托管的)。如果是这样,IIS静态文件处理程序允许访问静态文件和目录(以及您的内容文件夹)。因此,您可以搜索如何在IIS中禁用对静态文件的访问(可以在web.config中完成),或者如何限制对其中一些静态文件的访问 您可以从网站的配置中删除StaticFile处理程序,但您应该小心,因为从现在起IIS将不再提供静态文件
<configuration>
<system.webServer>
<handlers>
<remove name="StaticFile" />
</handlers>
</system.webServer>
</configuration>
如果您需要基本的文件处理,并且可以绝对控制您想要或不想要为哪些文件提供服务,那么您可以使用一些中间件来完全控制这些文件。我这样做是因为我希望在开发期间提供未缓存的文件服务
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Web;
namespace Owin
{
using AppFunc = Func<IDictionary<string, object>, Task>;
public static class DynamicFileExtension
{
/// <summary>
/// ONLY use during development
/// </summary>
public static void UseDynamicFiles(this IAppBuilder app, string baseDirectory)
{
app.Use(new Func<AppFunc, AppFunc>(next => (async context =>
{
var method = (string) context["owin.RequestMethod"];
var requestpath = (string) context["owin.RequestPath"];
var scheme = (string) context["owin.RequestScheme"];
var response = (Stream) context["owin.ResponseBody"];
var responseHeader = (Dictionary<string, string[]>) context["owin.ResponseHeaders"];
if (method == "GET" && scheme == "http")
{
var fullpath = baseDirectory + requestpath;
// block logic...
if (File.Exists(fullpath))
{
using (var file = File.OpenRead(fullpath))
{
await file.CopyToAsync(response);
}
var mime = MimeMapping.GetMimeMapping(fullpath);
responseHeader.Add("Content-Type", new[] {mime});
return;
}
}
await next.Invoke(context);
})));
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Threading.Tasks;
使用System.Web;
名称空间Owin
{
使用AppFunc=Func;
公共静态类动态文件扩展
{
///
///仅在开发期间使用
///
公共静态void UseDynamicFiles(此IAppBuilder应用程序,字符串baseDirectory)
{
使用(新函数)(下一步=>(异步上下文=>
{
var方法=(字符串)上下文[“owin.RequestMethod”];
var requestpath=(字符串)上下文[“owin.requestpath”];
var scheme=(字符串)上下文[“owin.RequestScheme”];
var response=(流)上下文[“owin.ResponseBody”];
var responseHeader=(字典)上下文[“owin.ResponseHeaders”];
if(method==“GET”&&scheme==“http”)
{
var fullpath=baseDirectory+requestpath;
//块逻辑。。。
if(File.Exists(完整路径))
{
使用(var file=file.OpenRead(完整路径))
{
等待文件.CopyToAsync(响应);
}
var mime=MimeMapping.GetMimeMapping(完整路径);
Add(“内容类型”,新[]{mime});
返回;
}
}
等待下一步。调用(上下文);
})));
}
}
}
我不会在生产中使用它,但它为我做到了 谢谢,这确实解决了问题。但是,在我的公用文件夹中提供其他文件似乎有问题。所以public包含index.html、style.css和script.js。提供索引,但style.css和script.js给出了404.4。有什么想法吗?奇怪,在我的电脑上一切正常,但我用自托管应用程序进行测试。您确定使用下一个URL yoursite/style.css而不是yoursite/public/style.css访问这些文件吗?这些文件存在于网站的文件夹中,对吗?还有一件事你可以试试。将下一个中间件注册为配置中的最后一个:app.Run(context=>{return context.Response.WriteAsync(“Wildcard OWIN app”);});将断点放置在代理内,并尝试从浏览器访问style.css。此处理程序是通配符中间件,用于处理其他中间件未处理的所有请求。如果应用程序将被断点停止,OWIN将处理请求,但配置不正确,否则IIS配置有问题。