Подкаталог Project как root для статических файлов

Новое в ASP.NET MVC, я создаю веб-приложение, используя мастер Visual Studio 2013. Он создает несколько папок, из которых обслуживаются статические файлы: 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.

Ответ 1

Update:

Бен

Предлагаемое решение работает только с Owin. Чтобы заставить его работать в приложении MVC, вы должны использовать только asp.net MVC 6 (часть ядра asp.net или asp.net 5). Но с помощью Web API вы также можете использовать более старые версии. Чтобы настроить приложение, выполните следующие действия:

  • Создайте пустой проект с использованием визуальных студийных шаблонов (не выбирайте веб-API или MVC)

  • Добавьте в проект следующие пакеты Nuget:

    Microsoft.AspNet.WebApi

    Microsoft.AspNet.WebApi.Owin

    Microsoft.Owin.Host.SystemWeb

    Microsoft.Owin.StaticFiles

  • Добавить файл Startup.cs и украсить пространство имен следующим

[сборка: OwinStartup (typeof (запуск))]

  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 будет обслуживать статические активы только из клиентской папки. Добавьте папку сервера и добавьте контроллеры.

Microsoft.Owin.Host.SystemWeb - это то, что облегчает хостинг приложения Owin в IIS. Параметры службы файлов помогают IIS обслуживать статические файлы только из клиентской папки.

Пожалуйста, дайте мне знать, если у вас есть вопросы.


В соответствии с вашим вопросом структура проекта, которую вы хотите достичь, должна выглядеть следующим образом.

Структура проекта

В основном у вас будет только две папки: клиент и сервер. Статические файлы подаются только из папки клиента. Папка сервера недоступна. Если это то, что вам нужно, то это может быть легко достигнуто с помощью автономного хоста Owin с промежуточным программным обеспечением статического файла.

Сам хост работает без какой-либо зависимости от IIS. Но если вы планируете разместить это приложение в Linux, вы можете использовать Asp.NET CORE 1.0. Позже, если вы решите разместить приложение в IIS внутри окон, что может быть достигнуто легко, добавив пакет Microsot.Owin.Host.SystemWeb nuget.

Есть хорошие сообщения в блогах по этой теме. Это ссылка для одного из них. Вот ссылка для достижения того же самого в Asp.NET Core.

Я надеюсь, что это решает ваши проблемы и, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

Спасибо, Сома.

Ответ 2

Лучшее решение, которое я нашел, - это игнорировать обычный способ 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 он работает, но каждый статический файл перемещается через С#, поэтому может быть решение с лучшей производительностью