65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (4投票s)

2016 年 6 月 7 日

CPOL

6分钟阅读

viewsIcon

13101

本文将指导您将现有的 ASP.NET 5 Beta8 应用转换为 ASP.NET Core RC2。

引用

更新将 ASP.NET Core RC2 升级到 RTM

引言

本文将指导您将现有的 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 转换的更多信息,请参阅下面的文章:

就是这样!希望有人觉得这篇文章有用。

摘要

在本文中,我们学习了如何将现有的 AS.NET 5 Beta8 应用转换为 ASP.NET Core RC2。

© . All rights reserved.