【问题标题】:Is it possible to use ASP.NET Core 2.x MVC on .NET Framework 4.6.1 console application是否可以在 .NET Framework 4.6.1 控制台应用程序上使用 ASP.NET Core 2.x MVC
【发布时间】:2019-11-02 00:23:39
【问题描述】:

我正在尝试将 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 框架可以找到的东西的任何机制。我做了一些研究,但目前还不清楚这一切是如何运作的。有一个名为Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 的东西显然会在运行时编译 cshtml 文件,但它具有 .NET Core 依赖项。在 ASP.NET 4.x 世界中,我相信有一个 ASP.NET 编译器可以作为处理此类事情的构建目标运行,但它是如何工作的还不清楚。几乎每个 ASP.NET Core 的 Visual Studio 模板都是围绕 .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>

【问题讨论】:

    标签: asp.net-mvc asp.net-core razor


    【解决方案1】:

    当您的项目以 .NET Framework 为目标时,您应该安装 Microsoft.AspNetCore.Mvc.Razor.ViewCompilation 包。

    它包含启用 Razor 视图编译所需的构建时引用。

    在您的.csproj 文件中包含其包引用:

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

    此额外步骤仅适用于 .net 核心项目目标

    在项目根目录执行以下命令,为framework-dependent deployment 准备应用程序:

    dotnet publish -c Release
    

    【讨论】:

    • 我安装了这个包,但是还是不行。如果我在 EXE 上运行 ildasm,我在 Views 命名空间中看不到任何东西,所以我认为没有任何东西被编译。我是否需要向 CSPROJ 添加任何内容才能真正告诉它编译这些文件?或者,是否有我可以在 上使用的 SDK 为我执行此操作?谢谢!
    • 我在 this article 中也找到了一些帮助 - 基本上我必须在我的 CSPROJ 文件中放置一个 &lt;Target Name="PrecompileRazorViews" AfterTargets="Build" DependsOnTargets="MvcRazorPrecompile" /&gt; ,然后将一些内容通过 DLL 复制到输出目录。
    • @MikeChristensen 非常感谢您的赏金。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2018-01-11
    相关资源
    最近更新 更多