C# Owin仅为特定文件夹中的文件提供服务

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

所以我在玩Owin和Katana,我想在我的公用文件夹中提供静态文件

我有一个带有样式表的内容文件夹和一个脚本文件夹

我的创业:

    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配置有问题。