ASP .Net 5 使用一个新的hosting framework,它将寻找一个名为 Startup 的类(或 Startup+environment,如 StartupDevelopment,如 in the docs 所述)。
此托管框架使用类Microsoft.AspNet.Hosting.WebHostBuilder 来创建IHostingEngine,但更有趣的是,它允许指定应在其中找到此类的程序集。
- 查看at the docs,您会发现这可以通过提供带有键Hosting:Application的配置值来实现。
指定此值的过程取决于您使用的框架版本。对于 beta7 及更早版本,还取决于您是使用 IIS 还是 dnx 命令来运行应用程序。
BETA8
其中一个latest changes in beta8与IIS Hosting模型正好相关。
这意味着在 beta8 中,无论您使用的是 IIS 还是 dnx 命令,设置配置值 Hosting:Application 的过程都是相同的:
-
您可以直接在 project.json 中为 dnx 命令行定义添加参数:
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel --Hosting:Application ClassLibrary1",
},
-
您可以在 dnx 命令行定义中添加一个配置参数,该参数指向一个 json 文件,您可以在其中指定用于启动托管的参数:
//project.json
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel --config hosting.json",
},
//hosting.json
{
"Hosting:Application": "ClassLibrary1",
}
-
如果您不指定配置文件,框架仍会在您的基本文件夹中查找名为 Microsoft.AspNet.Hosting.json 的文件。您可以创建该文件并在那里指定启动类。
- 如果您好奇,可以查看
Microsoft.AspNet.Hosting 程序集的Program 类中定义的此行为。
测试版 7
在 beta7 和更早版本中,指定此配置值的过程会有所不同,具体取决于您使用的是 IIS 还是 dnx 命令。
使用 dnx 命令
这与我在 beta8 部分中解释的方式非常相似,除了框架期望的托管配置文件是 .ini 文件。 (如果未提供,则默认情况下不会查找 Microsoft.AspNet.Hosting.json 文件)
基本上,如果您打开 project.json,您将看到一个名为 web 的命令,其定义如下:
"commands": {
"web": "Microsoft.AspNet.Hosting --config hosting.ini"
},
添加Hosting:Application 配置键有两个主要选项:
-
将参数直接添加到命令定义中
"commands": {
"web": "Microsoft.AspNet.Hosting --config hosting.ini --Hosting:Application ClassLibrary1"
},
-
将其添加到 hosting.ini 文件中:
server=Microsoft.AspNet.Server.WebListener
server.urls=http://localhost:5000
Hosting:Application=ClassLibrary1
您可以通过查看WebHostBuilder 类来更好地理解其工作方式,该类由Microsoft.AspNet.Hosting 中的Program.Main 函数使用
现在您需要告诉 VS 运行命令而不是 IIS。您可以通过选择默认运行操作来执行此操作:
您还可以在项目属性页面中为每个配置文件配置属性:
如果您想使用 web 命令而不是 IISExpress,您可能需要选择 Launch URL 操作,输入您网站的根 url(应该与您定义的匹配在您的 hosting.ini 文件中)。
您还可以选择添加命令行参数,因此您可以在此处定义输入--Hosting:Application=ClassLibrary1 的启动程序集。 (虽然在这里定义它意味着它只会在从 Visual Studio 启动应用程序时应用)
这些设置保存在您项目的 Properties 文件夹中的文件 launchSettings.json 中。 (第一次更改默认设置时会创建)当然你也可以手动修改这个文件。
当您使用 web 命令运行/调试项目时,您将看到一个 dnx 窗口打开,浏览器已启动(如果您在 web 配置文件中选择了 Launch URL),并且使用了指定程序集中的 Startup 类。例如,我将 Startup 移动到名为 ClassLibrary1 的项目中:
使用 IISExpress
由于这仍然使用旧的 Helios 托管组件,因此该过程与使用 dnx 命令时不同。
我已经深入研究了用于使用 IISExpress 启动应用程序的代码,我发现它在程序集 Microsoft.AspNet.Loader.IIS 中使用了 RuntimeHttpApplication.ApplicationStart。
- 这个类是调用新的
Microsoft.AspNet.Hosting的类,更具体地说它是创建WebHostBuilder,调用它的Build方法来获取IHostingEngine,最后在引擎中调用Start。李>
有趣的是,提供给WebHostBuilder 的配置可以包含一个名为 Microsoft.AspNet.Hosting.ini 的文件,该文件必须在网站的根路径中找到。 (因为它正在使用IHttpApplication.MapPath("/Microsoft.AspNet.Hosting.ini") 查找文件)。
这意味着您可以在应用程序的 wwwroot 文件夹中创建一个名为 Microsoft.AspNet.Hosting.ini(不区分大小写)的文件,其中包含如下一行:
Hosting:Application=ClassLibrary1