将 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