Project子目录作为静态文件的根目录

Mei*_*bur 12 asp.net-mvc routes

ASP.NET MVC的新手,我使用Visual Studio 2013向导创建Web应用程序.它创建从哪里静态文件供应几个文件夹:Content,Scripts,等.

其他语言的框架(例如TurboGears)只有静态内容的显式目录,消除了提供页面源代码而不是处理它的风险,这是PHP站点的典型配置错误.

然而,ASP.NET很乐意在应用程序的根目录中提供任何内容,例如http://localhost:1740/Project_Readme.html,只要它具有正确的扩展名.只有Views文件夹受保护Web.config.

如何将应用程序配置为使用除项目根目录之外的其他目录来获取静态文件.例如,如果文件favicon.ico被放入子目录中Content,它应该可以访问http://localhost:1740/favicon.ico,但除了Content控制器返回之外,没有任何内容在目录之外.

在此目录中不应该执行任何操作,也就是说,如果将*.cshtml文件放入此目录,则应将文件的内容(源代码)作为传递text/plain.

最终的应用程序将mod_mono在Linux上运行.

Som*_*dda 9

更新:

本,

建议的解决方案仅适用于Owin.要使它在MVC应用程序中工作,您必须只使用asp.net MVC 6(asp.net核心或asp.net 5的一部分).但是,使用Web API,您也可以使用旧版本.要设置应用程序,请使用以下步骤:

  1. 使用visual studio模板创建一个空项目(不要选择Web API或MVC)

  2. 将以下Nuget包添加到项目中:

    Microsoft.AspNet.WebApi

    Microsoft.AspNet.WebApi.Owin

    Microsoft.Owin.Host.SystemWeb

    Microsoft.Owin.StaticFiles

  3. 添加一个Startup.cs文件并使用以下命令修饰命名空间

[assembly:OwinStartup(typeof(Startup))]

  1. 将以下代码添加到Stratup.cs类

    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new {id = RouteParameter.Optional}
            );
        //Configure the file/ static file serving middleware
        var physicalFileSystem = new PhysicalFileSystem(@".\client");
        var fileServerOptions = new FileServerOptions
        {
            EnableDefaultFiles = true,
            RequestPath = PathString.Empty,
            FileSystem = physicalFileSystem
        };
    
        fileServerOptions.DefaultFilesOptions.DefaultFileNames = new[] {"index.html"};
        fileServerOptions.StaticFileOptions.ServeUnknownFileTypes = true;
        fileServerOptions.StaticFileOptions.FileSystem = physicalFileSystem;
        app.UseFileServer(fileServerOptions);
        app.UseWebApi(config);
    }
    
    Run Code Online (Sandbox Code Playgroud)
    1. 这应该是神奇的.现在您可以在IIS中托管应用程序.IIS将仅从客户端文件夹提供静态资产.添加Server文件夹并添加控制器.

Microsoft.Owin.Host.SystemWeb有助于在IIS中托管Owin应用程序.文件服务选项可帮助IIS仅从客户端文件夹提供静态文件.

请让我知道,如果你有任何问题.


根据您的问题,您要实现的项目结构应如下所示.

项目结构

基本上你只有两个文件夹,Client和Server.静态文件仅从客户端文件夹提供.无法访问服务器文件夹.如果这是您所需要的,那么可以使用带有静态文件服务中间件的Owin Self Host轻松实现.

自托管不依赖于IIS.但是,如果您计划在Linux上托管此应用程序,则可以使用Asp.NET CORE 1.0.稍后,如果您决定在Windows内部的IIS上托管应用程序,可以通过添加Microsot.Owin.Host.SystemWeb nuget包轻松实现.

关于这个主题有很棒的博客文章.这是其中一个的链接.这是在Asp.NET Core中实现相同的链接.

我希望这能解决您的问题,如果您有任何疑问,请告诉我.

谢谢,Soma.


小智 3

我发现的最好的解决方案是忽略asp.net正常方式并编写一种新方式

        public override void Init()
        {
            BeginRequest -= OnBeginRequest;
            BeginRequest += OnBeginRequest;
        }


        protected void OnBeginRequest(object sender, EventArgs e)
        {
            if (Request.Url.AbsolutePath.StartsWith("/endPoint"))
            {
                Context.RemapHandler(endPoint);
            }
            else
            {
                Context.RemapHandler(staticHandler);
            }
        }
Run Code Online (Sandbox Code Playgroud)

让 endPoint 和 staticHandler 实现 IHttpHandler 它可以工作,但每个静态文件都通过 C# 移动,因此可能有一个性能更好的解决方案