Можно ли использовать ASP.NET Core 2.x MVC в консольном приложении .NET Framework 4.6.1 - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь перенести приложение ASP.NET MVC 4.x на ASP.NET Core 2.2. WebApi прекрасно работает, но я застрял с портированием поверх видов MVC. Я создал полное «минимально жизнеспособное» репо, чтобы показать, что я имею в виду. Program.cs выглядит следующим образом:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace TestApp
{
    public class Program
    {
        static void Main(string[] args)
        {
            string port = "9005";

            var host = new WebHostBuilder()
                .UseKestrel()
                .UseStartup<Startup>()
                .UseUrls($"http://0.0.0.0:{port}")
                .Build();

            host.Run();
        }
    }

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services
                .AddMvcCore()
                .AddRazorViewEngine()
                .AddJsonFormatters();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseMvcWithDefaultRoute();
        }
    }
}

У меня есть один контроллер в Controllers \ HomeController.cs, который выглядит следующим образом:

using Microsoft.AspNetCore.Mvc;

namespace TestApp.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

У меня есть одно представление в Views \ Home \Index.cshtml, который выглядит следующим образом:

@{
    var x = "Test";
}

Home page

Когда я запускаю программу, я могу подтвердить, что достиг точки останова на return View(); - я не получаю никаких исключений или чего-либо еще. Однако браузер выдаст ошибку 500, и ничего не отобразится.

Моя теория заключается в том, что мне не хватает любого механизма, который компилирует Index.cshtml в нечто, что ASP.NET Core MVC Framework может найти. Я провел небольшое исследование, но очень неясно, как все это работает. Существует нечто, называемое Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation, которое, очевидно, выполняет компиляцию файлов cshtml во время выполнения, но имеет зависимость .NET Core. Я полагаю, что в мире ASP.NET 4.x существовал компилятор ASP.NET, который выполнялся бы как цель сборки, которая обрабатывает подобные вещи, но немного неясно, как он работает. Практически каждый шаблон Visual Studio для ASP.NET Core построен на основе .NET Core, который, кажется, волшебным образом заставляет этот материал работать, но я не совсем уверен, как. Кто-нибудь знает, какими будут следующие шаги, чтобы заставить это работать? Спасибо!

PS: Причина, по которой я не могу работать на платформе .NET Core, заключается в том, что этот проект имеет огромное количество зависимостей от устаревшего кода .NET Framework (Windows), на что уйдут годы. к порту.

Редактировать: Вот весь мой файл CSPROJ (я пробовал несколько SDK безрезультатно)

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net461</TargetFramework>
    <OutputPath>bin\$(Configuration)\</OutputPath>
    <DebugType>portable</DebugType>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Formatters.Json" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Net.Http" />
  </ItemGroup>
</Project>

1 Ответ

2 голосов
/ 02 ноября 2019

Когда ваш проект изменяется на .NET Framework, вы должны установить Microsoft.AspNetCore.Mvc.Razor.ViewCompilation пакет.

Он содержит ссылки на время сборки, необходимые для включения компиляции Razor-представления.

Включите ссылку на свой пакет в файл .csproj:

<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.2.0" PrivateAssets="All" />

Этот дополнительный шаг применим только к целям основного проекта .net

Выполнитьприведенная ниже команда в корневом каталоге проекта для подготовки приложения к каркасному развертыванию :

dotnet publish -c Release
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...