我在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位置指定给我的另一个程序集。
答案 0 :(得分:5)
ASP .Net 5使用新的hosting framework,它将查找名为 Startup 的类(或启动开发+环境,如StartupDevelopment,如in the docs所述)。
此托管框架使用类Microsoft.AspNet.Hosting.WebHostBuilder
来创建IHostingEngine
,但更有趣的是允许指定应该找到此类的程序集。
指定此值的过程取决于您使用的框架版本。对于beta7及更早版本,它还取决于您是使用IIS还是使用dnx命令来运行该应用程序。
<强> BETA8
其中一个latest changes in beta8与IIS托管模型完全相关。
这意味着在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。您可以通过选择默认运行操作来执行以下操作:
如果您想使用网络命令而不是IISExpress,您可能需要选择启动网址操作,输入您网站的根网址(应该与您定义的网址相匹配)在您的hosting.ini文件中)。
您还可以选择添加命令行参数,这样就可以在此处定义输入--Hosting:Application=ClassLibrary1
的启动程序集。 (虽然这里定义它意味着它只会在从visual studio启动应用程序时应用)
这些设置会保存到项目的属性文件夹中的文件launchSettings.json
中。 (将在您第一次更改默认设置时创建)当然您也可以手动修改此文件。
使用web命令运行/调试项目时,您将看到一个dnx窗口已打开,浏览器已启动(如果您在Web配置文件中选择了启动URL),则使用指定程序集中的Startup类。例如,我将Startup移动到名为ClassLibrary1的项目:
使用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")