将Startup.cs移动到类库(包)项目 - ASP.NET 5

时间:2015-10-17 06:00:39

标签: c# asp.net-core asp.net-core-mvc

我在MVC 6项目中工作,并将我的Startup.cs类从Web项目移动到Infraestructure项目,这是一个类库包。 我还在Infraestructure / project.son中添加了类所需的包(与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位置指定给我的另一个程序集。

1 个答案:

答案 0 :(得分:5)

ASP .Net 5使用新的hosting framework,它将查找名为 Startup 的类(或启动开发+环境,如StartupDevelopment,如in the docs所述)。

此托管框架使用类Microsoft.AspNet.Hosting.WebHostBuilder来创建IHostingEngine,但更有趣的是允许指定应该找到此类的程序集。

  • 查看at the docs,您会看到通过提供配置值并使用密钥托管:应用程序来实现此目的。

指定此值的过程取决于您使用的框架版本。对于beta7及更早版本,它还取决于您是使用IIS还是使用dnx命令来运行该应用程序。

<强> BETA8

其中一个latest changes in beta8与IIS托管模型完全相关。

  • 旧的Helios托管组件已被放弃,并且使用了一种新方法,允许在使用IIS托管时运行dnx命令。更多详情in the announcement

这意味着在beta8中,无论您使用的是IIS还是使用dnx命令,设置配置值托管:应用程序的过程都是相同的:

  • 您可以直接在 project.json 中的dnx命令行定义中添加参数:

    "commands": {
      "web": "Microsoft.AspNet.Server.Kestrel --Hosting:Application ClassLibrary1",
    },
    
  • 您可以在dnx命令行定义中添加一个config参数,该参数指向一个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类中看到此行为。

BETA 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中的Program.Main函数使用的Microsoft.AspNet.Hosting类,您可以更好地理解其工作方式

现在您需要告诉VS运行命令而不是IIS。您可以通过选择默认运行操作来执行以下操作: Choosing web or IISExpress when running project

您还可以在项目属性页面中为每个配置文件配置属性: Profile properties pages

  • 如果您想使用网络命令而不是IISExpress,您可能需要选择启动网址操作,输入您网站的根网址(应该与您定义的网址相匹配)在您的hosting.ini文件中)。

  • 您还可以选择添加命令行参数,这样就可以在此处定义输入--Hosting:Application=ClassLibrary1的启动程序集。 (虽然这里定义它意味着它只会在从visual studio启动应用程序时应用)

  • 这些设置会保存到项目的属性文件夹中的文件launchSettings.json中。 (将在您第一次更改默认设置时创建)当然您也可以手动修改此文件。

使用web命令运行/调试项目时,您将看到一个dnx窗口已打开,浏览器已启动(如果您在Web配置文件中选择了启动URL),则使用指定程序集中的Startup类。例如,我将Startup移动到名为ClassLibrary1的项目: Launching web command

使用IISExpress

由于这仍然使用旧的Helios托管组件,因此该过程与使用dnx命令时的过程不同。

我在使用IISExpress启动应用程序的代码中挖了一些,我发现它在程序集RuntimeHttpApplication.ApplicationStart中使用了Microsoft.AspNet.Loader.IIS

  • 此类是调用新Microsoft.AspNet.Hosting的类,更具体地说是创建WebHostBuilder,调用其Build方法获取IHostingEngine并最终调用{ {1}}在引擎中。

有趣的是,提供给Start的配置可以包含名为 Microsoft.AspNet.Hosting.ini 的文件,该文件必须位于网站的根路径中。 (因为它正在使用WebHostBuilder)来查找文件。

这意味着您可以在应用程序的 wwwroot 文件夹中创建名为 Microsoft.AspNet.Hosting.ini (不区分大小写)的文件,其中包含如下所示的单行:

IHttpApplication.MapPath("/Microsoft.AspNet.Hosting.ini")