Перенос на .NET Core из веб-приложения ASP.NET 4.5 MVC

Мне только что дали задание с некоторыми технологиями, с которыми я не знаком - наши прекрасные окна веб-приложение ASP.NET MVC должно быть преобразовано для использования в среде Linux.

Я работаю над здоровьем, и у нас есть пользовательские данные, которые абсолютно не могут быть потеряны или головы будут катиться (наши или их).

Я обычно не парень С#/ASP.NET, хотя я могу адаптироваться к задаче. Я читал официальные документы http://docs.asp.net/en/latest/getting-started/installing-on-linux.html и вижу, что эта задача в действительности означает "нацеливать платформу .NET CORE (или моно)".

Я googled вокруг, и нет де-факто/простой способ миграции, кажется - просто изучите новую модульную настройку с конфигурациями, наложенными на project.json и прочь! Прежде чем я попытаюсь сделать это вручную - есть ли информация, которую вы, ребята, могли бы мне посоветовать? Некоторые систематические процессы? Возможно, некоторые "gotchas", которые я должен был прочитать заранее?

Проект использует NHibernate и Autofac для DI - кажется довольно стандартным. Я просто хотел узнать, как много читает/экспериментирует это, чтобы запустить его на сервере Linux - в конечном счете, что важно.

Ответы

Ответ 1

Core CLR и BCL не готовы к производству. Период. По крайней мере, еще не и, вероятно, не в течение шести месяцев до года. На данный момент поддержка зависимостей еще больше неизвестна. В Autofac нет базовой библиотеки, совместимой с clr. Будут ли они? Это где-то начать исследования. Когда они будут? Это может быть какое-то время, и это требование проекта, которое находится вне вашего контроля.

Даже для нерабочей работы ядро ​​.NET все еще очень рано. Простой ответ заключался в том, чтобы сообщить вашему боссу подождать шесть месяцев и посмотреть, как все вытряхивается, а не потенциально сжигать сотни человеко-часов или предварительный код. Конечно, это, вероятно, будет проигнорировано, так вот как я буду продолжать сегодня, если бы мне абсолютно пришлось.

В вашем вопросе есть несколько изменений. Вы хотите перейти с ASP.NET 4.5 на ASP.NET 5. Вы также хотите настроить таргетинг на новую инфраструктуру. Наконец, вы планируете запустить решение в новой среде. Каждый из них может обрабатываться независимо (хотя некоторые из них не раньше других), так что это маршрут, который я бы взял.

Фаза 0) Нет версий поддерживаемых DNX версий .Net до 4.5.1. Вы будете использовать DNVM для выбора DNX для таргетинга. Вы не можете настроить таргетинг на то, что недоступно, поэтому, если ваш проект в настоящее время нацелен на что-то до обновления 4.5.1, и проверьте, нет ли изменений в изменении. Если есть исправление и совместимость condebase с 4.5.1 или новее.

Фаза 1) DNVM и DNX совместимы как с существующими "полными".Net Framework (4.5.1+), так и с .Net Core (5.0). Может возникнуть соблазн перейти прямо на ASP.NET 5, работающий на .Net Core 5, но это было бы ошибкой. Поскольку .Net Core требует, чтобы проект на основе dnx и проекты на основе dnx также поддерживали .Net 4.5.1 (или позже), первым шагом было бы перейти на новую структуру проекта, представленную asp.net 5. Это, вероятно, потребует некоторых экспериментов и на данный момент документация является спартанской. Целью будет ваше существующее приложение (asp.net 4.5 работает на .NET Framework 4.5.1, запущенном в dnx. Нет мастеров миграции проектов, поэтому вы начинаете с нового проекта dnx (используйте asp.net 5 "empty" ) шаблон) и копирование в существующем коде. Это может показаться незначительным изменением, но оно нарушает ту жесткую связь приложения с установленной инфраструктурой на хосте только Windows. После того, как вы используете базу кода в среде dnx, у вас есть основа, предназначенные для других сред.

Фаза 2) Перейдите на asp.net 5 (MVC 6). Вы по-прежнему будете нацеливаться на "полную".net-структуру и работать с окнами..Net не поддерживает (и никогда не будет) ваш существующий проект asp.net(4.5). Однако asp.net 5 совместим как с полным фреймворком (4.x), так и с ядром (5). Это дает вам возможность перейти на asp.net 5 без перехода на ядро ​​.net. Цель в конце фазы 2 - это веб-приложение (функциональное) с использованием asp.net 5, работающего на .net 4.x в dnx. Да, все еще на окнах, но мы приближаемся к совместимости между платформами.

Фаза 3) Сделайте список инвентаризаций существующих ссылок и зависимостей BCL, которые не поддерживаются в ядре .net. Рефакторинг существующих ссылок BCL, которые не поддерживаются в ядре .net. Помните, что ядро ​​.net является подмножеством полной структуры, поэтому вам может повезти, и весь существующий код соответствует этому подмножеству, но если вам нет, вам нужно найти способ достижения такой же функциональности с подмножеством, доступным в ядре .net.

Для зависимостей (то есть Autofac) очень вероятно, что вам нужно будет обновиться, и могут быть нарушения, которые необходимо устранить. Цель и конец фазы 3 - веб-приложение из фазы 2, но без каких-либо зависимостей, которые несовместимы с ядром bcl. Самый большой фактор вне вашего контроля - пакеты сторонних производителей. Если autofac не выпускает базовый CLR-совместимый пакет, тогда вы застреваете (или вам нужно будет использовать альтернативу).

Фаза 4). Конец фазы 3 означает, что у вас есть стандартный .NET-совместимый стек, но вы все еще нацелены на полную структуру. Теперь, наконец, вы переключите цель на core clr (dnvm поддерживает несколько бок о бок runtimes = dnx). В этот момент я все равно буду разворачиваться в окна, по одной переменной за раз. В конце фазы 4 у вас есть веб-приложение, работающее на ядре .net, размещенном в среде Windows.

Фаза 5). Теперь вы можете работать над разрешением любых зависимостей Windows. По крайней мере, взгляните на миграцию с IIS, убедитесь, что любая обработка пути выполняется нейтральным образом ОС, и нет вызовов для конкретных ресурсов Windows (например, реестра). Ключ clr и bcl должен быть более зрелым, так что вы не пытаетесь прицелиться в движущуюся цель.

Попытка сделать все это за один раз - это, на мой взгляд, рецепт катастрофы. При стольких параллельных изменениях вы начнете с нефункционального решения, и оно, вероятно, останется нефункциональным. Приняв это поэтапно, вы можете перенести решение на совместимую с перекрестным объектом цель, все еще имея функциональный выход на каждом этапе пути.

Ответ 2

Думаю, вы здесь смешаете. Ваш исходный оператор проблемы состоит в том, что у вас есть приложение MVC, выполняемое в настоящее время в Windows, которое должно запускаться в Linux. Это само по себе не проблема. Затем вы продолжаете говорить, что вы его исследовали, и пришли к выводу, что вам нужно установить ASP.Net 5 (ядро), чтобы использовать ваш сайт в Linux, что неверно.

Проекты ASP.Net MVC будут отлично работать в Mono.

Mono - это реализация Microsoft.NET Framework с открытым исходным кодом, основанная на стандартах ECMA для С# и Common Language Runtime.

Как сказано, Mono - это реализация с открытым исходным кодом. ASP.Net 5 является официальным предложением от Microsoft, но он не имеет обратной обратной совместимости с существующей базой кода. Он также работает поверх Mono.

Вы должны оценить свои требования у своего менеджера проекта, чтобы определить, является ли использование Моно приемлемым; в некоторых чувствительных областях (например, Health Care), Open Source не получил широкого распространения. Будьте готовы объяснить, что, хотя Mono Framework является открытым исходным кодом, ваше приложение, работающее в Mono Framework, не является. В целом, однако, организации, которые принимают Linux, используют больше программного обеспечения с открытым исходным кодом, чем они понимают, хотят ли они этого или нет.

В нижней строке вы можете запустить приложение MVC в Linux без каких-либо изменений в базе кода с помощью Mono Framework. Если использование официального дистрибутива Microsoft ASP.Net 5 Linux является требованием к проекту, вы все равно будете переписывать значительную часть своего приложения, прежде чем даже будете обеспокоены Linux и Windows.

Кроме того, еще одно дополнение к примечанию: ASP.Net 5 практически полностью Open Source от Microsoft, так что аргумент против использования Mono может быть спорным, хотя, вероятно, это будет упомянутая проблема.

Ответ 3

Я знаю, что это старый вопрос, но мне нужно обновить, я думаю. Потому что часть производственного приложения переносит asp.net mvc в ядро ​​asp.net. Я собираю некоторые пошаговые миграции. Я надеюсь, что это будет полезно.

Да, это возможно.

1) Создайте новое пустое веб-приложение ASP.NET Core с тем же именем, что и предыдущий проект. Таким образом, пространство имен будет соответствовать.

2) Установите пакеты Microsoft.AspNetCore.Mvc и Microsoft.AspNetCore.StaticFiles NuGet. Время выполнения ASP.NET является модульным, и вы должны явно использовать сервисные файлы

3) Откройте файл .csproj и добавьте цель PrepareForPublish: Например

  <Exec Command="bower install" />
</Target>

4) Откройте файл Startup.cs и измените код, чтобы он соответствовал следующему:

namespace WebApp1
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}

5) Добавьте папку Controllers. Затем добавьте класс контроллера MVC с именем HomeController.cs в папку Controllers.

  • Добавить папку Views.
  • Добавить папку Views/Home.
  • Добавьте страницу просмотра Index.cshtml, MVC в папку Views/Home.

Для среднего теста выполните следующие действия

Замените содержимое файла Views/Home/Index.cshtml следующим образом:

<h1>Hello world!</h1>

6) Перенастройка функций из проекта ASP.NET MVC. Нам нужно будет переместить следующее:

  • клиентский контент (CSS, шрифты и скрипты)
  • Контроллеры
  • вид
  • Модели
  • пакетирования
  • фильтры
  • Вход/выход, идентификация

7) Скопируйте каждый из методов из ASP.NET MVC OldController в NewController

8) Скопируйте файлы представления About.cshtml, Contact.cshtml и Index.cshtml Razor из проекта ASP.NET MVC в проект ASP.NET Core.

9) Запустите приложение ASP.NET Core и протестируйте каждый метод.

10) Для статического содержимого Добавьте к корню проекта файл конфигурации Bower с именем bower.json (щелкните правой кнопкой мыши проект, а затем выберите Add > New Item > Bower Configuration File). Добавьте Bootstrap и jQuery в файл

11) Скопируйте файл favicon.ico из старого проекта MVC в папку wwwroot в проекте ASP.NET Core.

12) Скопируйте файл _ViewStart.cshtml из старой папки представлений проекта ASP.NET MVC в папку представлений Project Project Core. Файл _ViewStart.cshtml не изменился в ASP.NET Core MVC.

13) Создайте папку Views/Shared.

14) Скопируйте файл _Layout.cshtml из старого проекта ASP/MVC проекта Views/Shared в проект/общую папку ASP.NET Core.

15) Измените некоторые старые функции в режиме бритвы с новостями, такими как followings

  • Замените @Styles.Render("~/Content/css") элементом <link> на load bootstrap.css
  • Удалите @Scripts.Render("~/bundles/modernizr"). Комментируйте строку @Html.Partial("_LoginPartial") (окружайте line с @*...*@).
  • Замените @Scripts.Render("~/bundles/jquery") на <script> элемент.
  • Замените @Scripts.Render("~/bundles/bootstrap") на <script>.