将 Startup.cs 移动到 Class 库(包)项目 - ASP.NET 5
Move Startup.cs to Class Library (Package) Project - ASP.NET 5
我在一个 MVC 6 项目中工作,并将我的 Startup.cs class 从 Web 项目移动到基础设施项目,这是一个 Class 库包。
我还在 Infraestructure/project.son:
中添加了 class 所需的包(与 Web 项目完全相同)
"Microsoft.AspNet.Diagnostics": "1.0.0-beta8",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-beta8",
"Microsoft.AspNet.Mvc": "6.0.0-beta8",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta8",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-beta8",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta8",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-beta8",
"Microsoft.Framework.Configuration.Json": "1.0.0-beta8",
"Microsoft.Framework.Logging": "1.0.0-beta8",
"Microsoft.Framework.Logging.Console": "1.0.0-beta8",
"Microsoft.Framework.Logging.Debug": "1.0.0-beta8",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta8"
但是当我 运行 应用程序出现以下异常时:
A type named 'StartupDevelopment' or 'Startup' could not be found in assembly 'UI.Web'.
at Microsoft.AspNet.Hosting.Startup.StartupLoader.FindStartupType
我没有找到任何方法来为我的另一个程序集指定 Startup.cs 位置。
ASP .Net 5 使用新的 hosting framework which will look for a class named Startup (Or Startup+environment as in StartupDevelopment, as explained in the docs).
此托管框架使用 class Microsoft.AspNet.Hosting.WebHostBuilder
来创建 IHostingEngine
,但更有趣的是允许指定应在其中找到此 class 的程序集。
- 查看 at the docs,您会发现这可以通过提供带有键 Hosting:Application.
的配置值来实现
指定此值的过程取决于您使用的框架版本。对于 beta7 和更早版本,它还取决于您是使用 IIS 还是 dnx 命令来 运行 应用程序。
BETA8
其中一个 latest changes in beta8 恰好与 IIS 托管模型有关。
- 旧的 Helios 托管组件已被放弃,并使用了一种新方法,允许 运行在使用 IIS 托管时使用 dnx 命令。更多详情 in the announcement
这意味着在 beta8 中设置配置值 Hosting:Application 的过程将是相同的,无论您使用的是 IIS 还是 dnx 命令:
您可以直接在 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 的文件。您可以创建该文件并在其中指定启动 class。
- 如果您好奇,可以在
Microsoft.AspNet.Hosting
程序集的 Program class 中查看此行为。
测试版 7
在 beta7 及更早版本中,指定此配置值的过程有所不同,具体取决于您使用的是 IIS 还是 dnx 命令。
使用 dnx 命令
这与我在 beta8 部分中解释的方式非常相似,除了框架期望的托管配置文件是 .ini 文件。 (如果未提供,默认情况下不会查找 Microsoft.AspNet.Hosting.json 文件)
基本上,如果您打开 project.json,您将看到一个名为 web 的命令,定义如下:
"commands": {
"web": "Microsoft.AspNet.Hosting --config hosting.ini"
},
添加 Hosting:Application
配置密钥有 2 个主要选项:
直接在命令定义中添加参数
"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
class, which is used by the Program.Main
function in Microsoft.AspNet.Hosting
更好地理解其工作方式
现在您需要告诉 VS 运行 命令而不是 IIS。您可以通过 selecting 默认的 运行 操作来做到这一点:
您还可以在项目属性页面中为每个配置文件配置属性:
如果您想使用 web 命令而不是 IISExpress,您可能需要 select 启动 URL 操作,输入您站点的根 url(它应该与您在 hosting.ini 文件中定义的相匹配)。
您还可以选择添加命令行参数,因此您可以在此处定义输入 --Hosting:Application=ClassLibrary1
的启动程序集。 (虽然在这里定义它意味着它只会在从 visual studio 启动应用程序时应用)
这些设置保存在项目 Properties 文件夹中的文件 launchSettings.json
中。 (第一次修改默认设置时会创建)当然你也可以手动修改这个文件
当您 run/debug 您的项目使用 web 命令时,您将看到一个 dnx window 打开,浏览器启动(如果您 selected Launch URL 在web 配置文件)并使用指定程序集中的 Startup class。例如,我将 Startup 移至名为 ClassLibrary1 的项目:
使用 IISExpress
由于这仍在使用旧的 Helios 托管组件,因此该过程与使用 dnx 命令时不同。
我深入研究了用于使用 IISExpress 启动应用程序的代码,我发现它在程序集 Microsoft.AspNet.Loader.IIS
.
中使用了 RuntimeHttpApplication.ApplicationStart
- 这个class是调用新的
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
我在一个 MVC 6 项目中工作,并将我的 Startup.cs class 从 Web 项目移动到基础设施项目,这是一个 Class 库包。 我还在 Infraestructure/project.son:
中添加了 class 所需的包(与 Web 项目完全相同)"Microsoft.AspNet.Diagnostics": "1.0.0-beta8",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-beta8",
"Microsoft.AspNet.Mvc": "6.0.0-beta8",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta8",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-beta8",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta8",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-beta8",
"Microsoft.Framework.Configuration.Json": "1.0.0-beta8",
"Microsoft.Framework.Logging": "1.0.0-beta8",
"Microsoft.Framework.Logging.Console": "1.0.0-beta8",
"Microsoft.Framework.Logging.Debug": "1.0.0-beta8",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta8"
但是当我 运行 应用程序出现以下异常时:
A type named 'StartupDevelopment' or 'Startup' could not be found in assembly 'UI.Web'.
at Microsoft.AspNet.Hosting.Startup.StartupLoader.FindStartupType
我没有找到任何方法来为我的另一个程序集指定 Startup.cs 位置。
ASP .Net 5 使用新的 hosting framework which will look for a class named Startup (Or Startup+environment as in StartupDevelopment, as explained in the docs).
此托管框架使用 class Microsoft.AspNet.Hosting.WebHostBuilder
来创建 IHostingEngine
,但更有趣的是允许指定应在其中找到此 class 的程序集。
- 查看 at the docs,您会发现这可以通过提供带有键 Hosting:Application. 的配置值来实现
指定此值的过程取决于您使用的框架版本。对于 beta7 和更早版本,它还取决于您是使用 IIS 还是 dnx 命令来 运行 应用程序。
BETA8
其中一个 latest changes in beta8 恰好与 IIS 托管模型有关。
- 旧的 Helios 托管组件已被放弃,并使用了一种新方法,允许 运行在使用 IIS 托管时使用 dnx 命令。更多详情 in the announcement
这意味着在 beta8 中设置配置值 Hosting:Application 的过程将是相同的,无论您使用的是 IIS 还是 dnx 命令:
您可以直接在 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 的文件。您可以创建该文件并在其中指定启动 class。
- 如果您好奇,可以在
Microsoft.AspNet.Hosting
程序集的 Program class 中查看此行为。
- 如果您好奇,可以在
测试版 7
在 beta7 及更早版本中,指定此配置值的过程有所不同,具体取决于您使用的是 IIS 还是 dnx 命令。
使用 dnx 命令
这与我在 beta8 部分中解释的方式非常相似,除了框架期望的托管配置文件是 .ini 文件。 (如果未提供,默认情况下不会查找 Microsoft.AspNet.Hosting.json 文件)
基本上,如果您打开 project.json,您将看到一个名为 web 的命令,定义如下:
"commands": {
"web": "Microsoft.AspNet.Hosting --config hosting.ini"
},
添加 Hosting:Application
配置密钥有 2 个主要选项:
直接在命令定义中添加参数
"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
class, which is used by the Program.Main
function in Microsoft.AspNet.Hosting
现在您需要告诉 VS 运行 命令而不是 IIS。您可以通过 selecting 默认的 运行 操作来做到这一点:
您还可以在项目属性页面中为每个配置文件配置属性:
如果您想使用 web 命令而不是 IISExpress,您可能需要 select 启动 URL 操作,输入您站点的根 url(它应该与您在 hosting.ini 文件中定义的相匹配)。
您还可以选择添加命令行参数,因此您可以在此处定义输入
--Hosting:Application=ClassLibrary1
的启动程序集。 (虽然在这里定义它意味着它只会在从 visual studio 启动应用程序时应用)这些设置保存在项目 Properties 文件夹中的文件
launchSettings.json
中。 (第一次修改默认设置时会创建)当然你也可以手动修改这个文件
当您 run/debug 您的项目使用 web 命令时,您将看到一个 dnx window 打开,浏览器启动(如果您 selected Launch URL 在web 配置文件)并使用指定程序集中的 Startup class。例如,我将 Startup 移至名为 ClassLibrary1 的项目:
使用 IISExpress
由于这仍在使用旧的 Helios 托管组件,因此该过程与使用 dnx 命令时不同。
我深入研究了用于使用 IISExpress 启动应用程序的代码,我发现它在程序集 Microsoft.AspNet.Loader.IIS
.
RuntimeHttpApplication.ApplicationStart
- 这个class是调用新的
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