将 ASP.NET 5 Beta 8 应用转换为 ASP.NET Core RC2






4.67/5 (4投票s)
本文将指导您将现有的 ASP.NET 5 Beta8 应用转换为 ASP.NET Core RC2。
引用
引言
本文将指导您将现有的 ASP.NET 5 Beta8 应用转换为 ASP.NET Core RC2。
背景
去年年底,我写了一篇关于“将现有的 ASP.NET 5 旧版本升级到 Beta8”的文章。从那时起,我一直坚持使用 Beta 8 版本来构建 ASP.NET Core 应用原型。除了懒惰之外,我的本意是不将现有项目升级到 RC1,因为我知道 RC2 将在不久的将来发布。
几天前,Microsoft 宣布了 ASP.NET Core RC2 的发布。此版本继 ASP.NET 5 RC1 版本之后,进行了许多更新,以增强与其他 .NET 框架的兼容性并改进运行时。
Beta 版本和 RC2 之间的一个关键变化是引入了 .NET 命令行界面 (CLI)。此工具取代了 dnvm、dnx 和 dnu 工具,提供了一个单一工具来承担这些工具的职责。要了解有关 .NET CLI 的更多信息,请参阅宣布 .NET Core RC2 和 .NET Core SDK Preview 1。
如果您一直使用 ASP.NET 5 Beta 8 版本,并且想将您的应用程序迁移到当前最新版本 RC2,那么本文适合您。虽然本文没有列出所有更改,但它会列出最基本部分的更改,以便您的应用程序可以在 RC2 版本下运行。
使用代码
警告:前方有剧透!
随着 ASP.NET Core RC2 的发布,底层将会有重大变化,因此请准备好更长的转换列表。:)
让我们开始吧!
您需要做的第一件事是升级您的 Visual Studio 2015 到 Update 2。您可以在此处查看 Visual Studio 的发布信息并下载更新。
在 Visual Studio 中应用设置和配置后,请在此处下载 ASP.NET Core RC2。
安装后,请确保重新启动计算机以确保更新生效。
在这次转换中,我将使用我之前演示过的ASP.NET MVC 6 项目。现在让我们开始修改。
global.json 更改
将您的 global.json 更改为此(如果您有的话)
{ "projects": [ "src", "test" ], "sdk": { "version": "1.0.0-preview1-002702" } }
我们在这里更改了两件事:首先是将“sources”节点替换为“projects”,然后将版本从“1.0.0-beta8”替换为“1.0.0-preview1-002702”——这是当前最新版本的 RC2。
project.json 更改
依赖项
将运行时添加为依赖项
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.0-rc2-3002702",
"type": "platform"
},
- 将所有“Microsoft.AspNet.*”依赖项替换为“Microsoft.AspNetCore.*”
- 然后将版本后缀从“-beta8”替换为“-rc2-final”。
- 注意:如果您引用的是**“Microsoft.AspNet.Mvc": "6.0.0-beta8"**,请确保将版本更改为“1.0.0”,这样它看起来会像**"Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final"**。
- 接下来,将所有“Microsoft.Framework.*”引用更改为“Microsoft.Extensions.*”。
- 如果您使用 SQL Server,则需要将“EntityFramework.SqlServer”的引用更改为“Microsoft.EntityFrameworkCore.SqlServer”。
- 之后,将现有的程序集更改为新名称,例如:“Microsoft.AspNet.IISPlatformHandler”更改为“Microsoft.AspNetCore.Server.IISIntegration”,以及“Microsoft.AspNet.Identity.EntityFramework”更改为“Microsoft.AspNetCore.Identity.EntityFrameworkCore”
- 添加以下配置和诊断引用
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final",
frameworks
使用以下新的命名结构更改您的 frameworks 部分
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"dnxcore50",
"portable-net45+win8"
]
}
},
工具
您需要将现有的“command”部分重命名为“tools”,并从预览版添加以下工具配置,如下所示:
"tools": {
"Microsoft.AspNetCore.Razor.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.AspNetCore.Server.IISIntegration.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview1-final",
"imports": [
"portable-net45+win8+dnxcore50",
"portable-net45+win8"
]
},
"Microsoft.Extensions.SecretManager.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
"version": "1.0.0-preview1-final",
"imports": [
"portable-net45+win8+dnxcore50",
"portable-net45+win8"
]
}
},
publishOptions
接下来,删除现有的“bundleExclude”和“bundle”配置部分,并用新的 **publishOptions** 部分替换它们,如下所示:
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings.json",
"web.config"
]
}
像这样添加 **buildOptions** 和 **runtimeOptions** 部分:
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"gcServer": true
},
将“preserveCompilationContext”设置为“true”将编译视图。此设置尤其重要,如果您使用的是需要编译的强类型视图。
添加新的“Scripts”部分
"scripts": {
"postpublish": [ "dotnet publish-iis
--publish-folder %publish:OutputPath%
--framework %publish:FullTargetFramework%" ]
}
总结所有更改
在汇总了更改后,这是我更新后的 project.json 文件:
{
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.0-rc2-3002702",
"type": "platform"
},
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
"Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Razor.Tools": {
"version": "1.0.0-preview1-final",
"type": "build"
},
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview1-final",
"type": "build"
},
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
"version": "1.0.0-preview1-final",
"type": "build"
},
"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
"version": "1.0.0-preview1-final",
"type": "build"
},
"Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-final"
},
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"dnxcore50",
"portable-net45+win8"
]
}
},
"tools": {
"Microsoft.AspNetCore.Razor.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.AspNetCore.Server.IISIntegration.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.EntityFrameworkCore.Tools": {
"version": "1.0.0-preview1-final",
"imports": [
"portable-net45+win8+dnxcore50",
"portable-net45+win8"
]
},
"Microsoft.Extensions.SecretManager.Tools": {
"version": "1.0.0-preview1-final",
"imports": "portable-net45+win8+dnxcore50"
},
"Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
"version": "1.0.0-preview1-final",
"imports": [
"portable-net45+win8+dnxcore50",
"portable-net45+win8"
]
}
},
"publishOptions": {
"include": [
"wwwroot",
"Views",
"appsettings.json",
"web.config"
]
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"gcServer": true
},
"scripts": {
"postpublish": [ "dotnet publish-iis
--publish-folder %publish:OutputPath%
--framework %publish:FullTargetFramework%" ]
}
}
现在**保存**文件,它将为您的应用程序还原所需的包。
xproj 文件更改
首先卸载您的项目,然后右键单击它以编辑项目文件。我们需要手动更改文件中的一些配置,因为您现有的 xproj 文件引用了使用 DNX 的旧 Beta 8 工具。在这种情况下,我们需要将字符串“DNX\Microsoft.DNX.Props”更改为“DotNet\Microsoft.DotNet.Props”。基本上,“DNX”引用现在将更改为“DotNet”。因此,您的 import 标签现在应该如下所示:
<Import Project="$(VSToolsPath)\DotNet\Microsoft.DotNet.Props" Condition="'$(VSToolsPath)' != ''" />
您还需要将字符串“DNX\Microsoft.DNX.targets”更改为“DotNet.Web\Microsoft.DotNet.Web.Props”。您的其他 import 标签现在应该如下所示:
<Import Project="$(VSToolsPath)\DotNet.Web\Microsoft.DotNet.Web.targets"
Condition="'$(VSToolsPath)' != ''" />
您可能还需要将 **BaseIntermediateOutputPath** 和 **OutputPath** 更改为:
<BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)'=='' ">.\obj</BaseIntermediateOutputPath>
<OutputPath Condition="'$(OutputPath)'=='' ">.\bin\</OutputPath>
最后,在 OutputPath 元素下方添加一个 **TargetFrameworkVersion**:
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
现在**保存**您的 .xproj 文件,然后在 Visual Studio 中重新加载您的项目。
代码更改
添加 Program.cs 文件
添加此类并非强制要求,因为您可以直接在现有的 startup.cs 文件中添加入口点。但是,为了遵循 RC2 的新项目模板,我决定生成一个名为“Program.cs”的独立文件来放置我们的主入口点——**static void Main()** 方法。
Program.cs 文件包含 ASP.NET Core RC2 应用的 Main 方法,负责配置和运行应用程序。它看起来会像这样:
using System.IO;
using Microsoft.AspNetCore.Hosting;
namespace MVC6Demo
{
public class Program
{
public static void Main(string[] args){
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
修改 Startup.cs
这是我的 Startup.cs 文件中的更改:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath);
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
重命名命名空间
由于我们的 project.json 程序集引用已更改,因此我们也需要更改正在使用的命名空间。例如,执行“查找和替换”,然后将“using Microsoft.AspNet”更改为“using Microsoft.AspNetCore”。以下是我项目中受影响的更改:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
您还需要更改以下命名空间的引用:
"Microsoft.Framework.DependencyInjection" > "Microsoft.Extensions.DependencyInjection" "Microsoft.Data.Entity" > "Microsoft.EntityFrameworkCore"
launchSettings.json 更改
在 Properties 下,打开 **launchSettings.json** 文件。找到“web”部分,并用下面的新“DotNet”内容替换它:
"MVC6Demo": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "https://:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
“ASPNETCORE_ENVIRONMENT”替换了旧的“Hosting:Environment”,是 RC2 的新环境变量。
您可能还想更改 IIS Express 使用的端口号。在我的情况下,我有这个配置:
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "https://:50295/",
"sslPort": 0
}
},
ViewComponent 更改
**InvokeAsync** 现在接受匿名对象而不是单独的参数。有了这个更改,您需要在视图中调用 **@Component.InvokeAsync(“View Component 名称”,)**。在我之前的示例中,我需要更改这个调用:
@await Component.InvokeAsync("HeroList", "strength")
改为这样。
@await Component.InvokeAsync("HeroList", new { type = "strength" })
现在**保存**并**编译**您的项目。这是已转换为 ASP.NET MVC Core RC2 的 ASP.NET MVC 6 应用的示例截图:
图 1:输出
如果您在迁移应用程序时遇到问题,请尝试在 Configure() 方法中启用 UseDeveloperExceptionPage 来诊断和排除故障。
public void Configure(IApplicationBuilder app){
app.UseDeveloperExceptionPage();
}
注意:我知道本文没有涵盖一些更改,因为我只是基于一个简单的项目进行转换。要了解有关 RC2 转换的更多信息,请参阅下面的文章:
- 从 DNX 迁移到 .NET Core
- 从 ASP.NET 5 RC1 迁移到 ASP.NET Core 1.0 RC2
- 将您的 Entity Framework 代码从 RC1 迁移到 RC2
- 将 ASP.NET Core RC1 项目转换为 RC2
就是这样!希望有人觉得这篇文章有用。
摘要
在本文中,我们学习了如何将现有的 AS.NET 5 Beta8 应用转换为 ASP.NET Core RC2。