(1-2)配置的升级 - ASP.NET从MVC5升级到MVC6

时间:2021-04-05 21:45:10

ASP.NET从MVC5升级到MVC6 总目录

MVC5和MVC6的区别

在MVC5的时候,web.config文件无疑是整个配置的核心,从web配置,到应用程序的参数,都可以写在web.config里面的。

一个典型的web.config看上去是这样的。应用程序使用的各种设定,项目中的各种动态链接库及其版本信息,错误页面的指定,未知文件扩展名的注册等等,包罗万象。

<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=301880
-->
<configuration>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="URLBASE" value="http://codesnippet.info" />
<add key="DEBUGMODE" value="true" />
<!--<add key="DEBUGMODE" value="false" />--> <!-- Image-->
<!--<add key="Image" value="Mongo" />-->
<add key="Image" value="FileSystem" />
<!--<add key="Image" value="QiNiu" />--> <!-- Thumbnail -->
<!--<add key="Thumbnail" value="Mongo" />-->
<add key="Thumbnail" value="FileSystem" />
<!--<add key="Thumbnail" value="QiNiu" />--> <!-- Github OAuth -->
<add key="GITHUB:ClientSecret" value="123456" />
<add key="GITHUB:ClientID" value="123456" />
<add key="GITHUB:AppName" value="codesnippet" />
<!-- QQ OAuth-->
<add key="QQ:AppID" value="123456" />
<add key="QQ:AppKey" value="123456"/>
<add key="QQ:CallBack" value="http://www.codesnippet.info/Home/QQOAuth"/>
<add key="QQ:AuthorizeURL" value="https://graph.qq.com/oauth2.0/authorize" /> <!-- QiNiu Storage -->
<add key="QINIU:AK" value="123456" />
<add key="QINIU:SK" value="123456" />
<add key="QINIU:BUCKET" value="gridfilesystem" />
<add key="QINIU:URLBASE" value="123456" />
<!-- Search Method -->
<!--<add key="SearchMethod" value="MongoTextSearch" />-->
<add key="SearchMethod" value="ElasticSearch" />
</appSettings>
<!--
For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367. The following attributes can be set on the <httpRuntime> tag.
<system.Web>
<httpRuntime targetFramework="4.5.1" />
</system.Web>
-->
<system.web>
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<customErrors mode="Off" />
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<system.webServer>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<staticContent>
<remove fileExtension=".woff"/>
<remove fileExtension=".woff2"/>
<remove fileExtension=".svg"/>
<mimeMap fileExtension=".woff" mimeType="application/x-font-woff" />
<mimeMap fileExtension=".woff2" mimeType="application/x-font-woff" />
<mimeMap fileExtension=".svg" mimeType="image/svg+xmz" />
</staticContent>
</system.webServer>
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="false" />
</settings>
</system.net>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
</compilers>
</system.codedom>
</configuration>

MVC6的配置

首先,MVC的默认配置变成了JSON文件。(ASP.NET Core的配置管理支持XML,JSON,INI三种方式。)

你可以将配置文件做成自己喜欢的文件格式,或者多个文件格式混用。

(以下示例代码来自 XiaoFaye的Github开源示例,三个配置文件的内容这里省略了,详细请参见Github)

using System;
using Microsoft.Extensions.Configuration; namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddXmlFile("appsettings.xml")
.AddIniFile("appsettings.ini"); builder.AddEnvironmentVariables();
IConfigurationRoot Configuration = builder.Build(); Console.WriteLine("Read json configuration file: " + Configuration["JsonData:DefaultConnection:ConnectionString"]);
Console.WriteLine(".");
Console.WriteLine(".");
Console.WriteLine("Read xml configuration file: ");
Console.WriteLine("Xml node content: " + Configuration["DefaultConnection"]);
Console.WriteLine("Xml node attribute 1: " + Configuration["DefaultConnection:key"]);
Console.WriteLine("Xml node attribute 2: " + Configuration["DefaultConnection:value"]);
Console.WriteLine(".");
Console.WriteLine(".");
Console.WriteLine("Read ini configuration file: " + Configuration["IniData:DefaultConnection"]);
}
}
}

典型的Project.Json

Converting an ASP.NET Core RC1 Project to RC2

配置文件比较长,这里就不再完整列出了,如果你想查看一个完整的例子。请使用以下链接

一个完整的Project.json的例子

这里有一个注意点,ASP.NET Core可以同时支持经典的NET Framework 和 NET Core,使用哪个Framework,可以在配置里面定义。

  • 如果你想使用全新的.NET Core的Framework ,请这样配置你的 framework 节
"frameworks": {
"netcoreapp1.0": {
"imports": [
"dotnet5.6",
"dnxcore50",
"portable-net45+win8"
]
}
},
  • 如果您想使用.NET Framework 4.5.x,请这样配置你的 framework 节
"frameworks": {
"net452": { }
},

如果您想知道两个Framework之间的区别您可以阅读本站以下文章:

补充知识 .Net Framework .Net Core Mono 区别联系

一个简单的配置文件

{
"version": "1.0.0-*",
"buildOptions": {
"preserveCompilationContext": true,
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.0.0-*",
"Microsoft.AspNetCore.Mvc.TagHelpers": "1.0.0-*",
"Microsoft.AspNetCore.Diagnostics": "1.0.0-*",
"Microsoft.AspNetCore.StaticFiles": "1.0.0-*",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-*",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0-*",
"Microsoft.Extensions.Logging.Console": "1.0.0-*",
"Microsoft.Extensions.Logging.Debug": "1.0.0-*",
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002700"
}
},
"frameworks": {
"netcoreapp1.0": {
"imports": "dnxcore50"
}
}
}

典型的appsettings.json

有一些关于应用程序业务逻辑,环境配置的参数,原来也是写在Web.config里面的,现在这个版本可以放到appsettings.json

我们看一下官方自动生成的appsettings.json是什么样子的。

数据库的连接字符串,日志设定,这些被放到了appsettings.json里面了。

{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-NetCoreWeb-dff472d2-ddfc-4d7a-bb9c-19ab91e3564f;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}

注意:和project.json这个第一等公民不同,appsettings.json属于第二等公民(可选非必需)

它需要在启动的时候,引入Configuration系统。当然,笔者认为,即使你修改名称也是可以的,只要代码里面也相应修改即可。

            var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

使用方法是这样的:

            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

当然,如果你仔细研究的话,web.config文件还是有的。应该是在IIS模式的时候,IIS是必须有web.config的(可能不对,请指正)。

这里增加了AspNetCoreModule这个Handler。

Announcing ASP.NET Core RC2

IIS Support Baked In

IIS is a tremendous web server and we continue to provide first-class support for it. Use the new ASP.NET Core Module in your web.config (it’s added in the new project templates) to configure IIS to launch and host your application.

IIS是一个极其重要的Web服务器,我们继续为其提供最高等级的支持。使用新的ASP.NET Core Module在你的Web.config中,用来配置你的IIS,使其可以运行和作为你的应用程式的宿主。

<?xml version="1.0" encoding="utf-8"?>
<configuration> <!--
Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
--> <system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
</system.webServer>
</configuration>

参考文献

Converting an ASP.NET Core RC1 Project to RC2

ASP.NET官网Configuration

XiaoFaye的XiaoFaye/netcore-samples Github

Artech 博客园系列文章 .NET Core全新的配置管理[共9篇]

解读ASP.NET 5 & MVC6系列(5):Configuration配置信息管理