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

时间:2014-09-04 15:16:56

标签: asp.net-mvc routes

ASP.NET MVC的新手,我正在使用Visual Studio 2013向导创建一个Web应用程序。它会创建几个文件夹,从中提供静态文件:ContentScripts等。

其他语言的框架(例如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的形式传递。

最终应用程序将在Linux上使用mod_mono运行。

2 个答案:

答案 0 :(得分: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文件并使用以下

  4. 修饰命名空间

    [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);
      }
      
      1. 这应该是魔术。现在您可以在IIS中托管应用程序。 IIS将仅从客户端文件夹提供静态资产。添加Server文件夹并添加控制器。
    2. Microsoft.Owin.Host.SystemWeb有助于在IIS中托管Owin应用程序。文件服务选项可帮助IIS仅从客户端文件夹提供静态文件。

      如果您有任何疑问,请与我们联系。

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

      Project Structure

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

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

      关于此主题有很多博客文章。这是其中一个的link。这是link在Asp.NET Core中实现相同的功能。

      我希望这可以解决您的问题,如果您有任何问题,请告诉我。

      谢谢你, 索马。

答案 1 :(得分: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);
            }
        }

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