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

Fra*_*nco 4 c# asp.net-core-mvc asp.net-core

我正在一个MVC 6项目中工作,并将我的Startup.cs类从Web项目移动到Infraestructure项目,这是一个类Libary包.我还在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"
Run Code Online (Sandbox Code Playgroud)

但是,当我运行应用程序时,获得以下异常:

A type named 'StartupDevelopment' or 'Startup' could not be found in assembly 'UI.Web'.
at Microsoft.AspNet.Hosting.Startup.StartupLoader.FindStartupType
Run Code Online (Sandbox Code Playgroud)

我没有找到任何方法将Startup.cs位置指定给我的另一个程序集.

Dan*_*.G. 5

ASP .Net 5使用一个新的托管框架,它将寻找一个名为Startup的类(或Startup开发+环境,如在StartupDevelopment中,如文档中所述).

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

  • 查看文档,您将看到通过提供密钥Hosting:Application的配置值可以实现这一点.

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


BETA8

beta8最新变化之一与IIS Hosting模型完全相关.

  • 旧的Helios托管组件已被放弃,并且使用了一种新方法,允许在使用IIS托管时运行dnx命令.公告中有更多细节

这意味着在beta8中设置配置值Hosting:Application的过程将是相同的,无论您使用的是IIS还是使用dnx命令:

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

    "commands": {
      "web": "Microsoft.AspNet.Server.Kestrel --Hosting:Application ClassLibrary1",
    },
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以在dnx命令行定义中添加一个config参数,该参数指向一个json文件,您可以在其中指定用于启动托管的参数:

    //project.json
    "commands": {
      "web": "Microsoft.AspNet.Server.Kestrel --config hosting.json",
    },
    
    //hosting.json
    {  
      "Hosting:Application": "ClassLibrary1",
    }         
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果未指定配置文件,框架仍将在基础文件夹中查找名为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"
},
Run Code Online (Sandbox Code Playgroud)

您有2个主要选项来添加Hosting:Application配置键:

通过查看函数WebHostBuilder使用的类,您可以更好地理解它的工作方式Program.MainMicrosoft.AspNet.Hosting

现在,您需要告诉VS运行命令而不是IIS.您可以通过选择默认运行操作来执行以下操作: 运行项目时选择Web或IISExpress

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

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

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

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

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

使用IISExpress

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

我挖用于开始使用IISExpress应用程序的代码了一下,我发现它是用RuntimeHttpApplication.ApplicationStart在组装Microsoft.AspNet.Loader.IIS.

  • 这个类是调用new的类Microsoft.AspNet.Hosting,更具体地说是创建它WebHostBuilder,调用它的Build方法来获取IHostingEngine并最终调用Start引擎.

有趣的是,提供给WebHostBuildercan 的配置包括一个名为Microsoft.AspNet.Hosting.ini的文件,该文件必须在网站的根路径中找到.(因为它正在寻找使用的文件IHttpApplication.MapPath("/Microsoft.AspNet.Hosting.ini")).

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

Hosting:Application=ClassLibrary1
Run Code Online (Sandbox Code Playgroud)