【问题标题】:Move Startup.cs to Class Library (Package) Project - ASP.NET 5将 Startup.cs 移至类库(包)项目 - ASP.NET 5
【发布时间】:2015-10-17 06:00:38
【问题描述】:

我在一个 MVC 6 项目中工作,并将我的 Startup.cs 类从 Web 项目移动到一个基础设施项目,这是一个类库包。 我还在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 位置指定给我的另一个程序集的任何方法。

【问题讨论】:

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


【解决方案1】:

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模型正好相关。

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

这意味着在 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

【讨论】:

  • 首先,感谢您的出色回答。我做了它,但只有一次,没有更多。我所做的是将Startup.csappsettings.json 移动到类库项目中,安装Startup.cs 使用的包,添加命令:"web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001 --Hosting:Application ClassLibraryName",并向ClassLibrary/project.json 添加一个条目,指定共享文件(喜欢[这里]github.com/aspnet/Home/wiki/Project.json-file#shared-files)。我不知道这一切是否正确,但我会继续努力。
  • 我刚刚尝试了 beta8,它工作正常,我已经更新了答案。为了移动类,我创建了一个新的类库项目,将启动类移到那里,复制了原始 MVC projec.json 的依赖项和框架部分。然后我添加了一个从 MVC 项目到类库的引用(因为您仍然使用 MVC 项目作为定义 dnx 命令的起始项目)
  • 好吧,看来它奏效了,谢谢您的努力。我想知道几件事:1- ClassLibrary1 中 project.json 的framework/dnxcore50 部分不需要默认提供的所有默认包吗?你刚刚删了? 2- 我意识到 Web 和 ClassLibrary1 项目中的所有包都现在重复了,例如 MVC、ConsoleLogging 等。我觉得不是什么好东西,所以我删除了Web中project.json中的dependencies部分,除了对ClassLibrary1的引用。这个可以吗?它似乎工作正常,但我不确定....
  • 关于第一个问题,似乎只是在一般依赖项部分添加至少一个包,其中任何一个支持 4.5.1 和核心(不是 dnx451/dependencies 或 dnxcore50/dependencies),自动包含最低要求的包(Microsoft.CSharp、System.Collections 等)。绝对删除所有依赖项使得可能的编译仅适用于 4.5.1(我想是因为库包含在 SO .NET 框架中)
  • 恐怕我不知道如何在不从您开始的项目中引用它的情况下包含引导项目。对我来说,这听起来像是一个不错的 ASP 5/dnx 问题!
猜你喜欢
  • 2015-01-04
  • 2019-11-08
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2015-02-23
  • 2017-05-17
  • 1970-01-01
相关资源
最近更新 更多