![](/img/trans.png)
[英]ASP.NET Core 2 Web Application Reference to .NET Standard Library
[英]ASP net core MVC - Start Web application in a library
我需要从控制台项目启动一个使用 Kestrel 自行托管的 Web 应用程序。 Web 应用程序位于库中。 我有两个项目的解决方案,即:
App.Console 调用 APP.WebSite 单例方法来启动 Web 应用程序。 解决方案可以编译,但是当网站启动时,我收到了 50 多个错误,如以下屏幕截图:
如果我将 APP.WebSite 修改为控制台应用程序,它会定期启动而不会出现错误。 我错在哪里?
EDIT1:启动控制台应用程序:
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Test.Start.StartApp();
Console.ReadKey();
}
StartApp 静态方法:
public static void StartApp()
{
var s = Directory.GetCurrentDirectory();
//activate web hosting here
var host = new WebHostBuilder()
.UseKestrel(o =>
{
o.AllowSynchronousIO = true;
o.ListenAnyIP(5000);
//o.ListenLocalhost(5000);
})
.UseWebRoot(s + "/Web/wwwroot")
//.UseContentRoot(s+"/Web/wwwroot")
.UseStartup<StartUpWeb>()
.Build();
host.Start();
}
在 Web/wwwroot 中有所有客户端文件
EDIT2:解决方案文件夹:
我能够使用 .NET Core 3.1.1 实现您想要的功能,但是我必须做一些事情。
首先你的文件夹结构是错误的。
正确的文件夹结构是这样的:
请注意,我将 wwwroot 文件夹移动到名为 Web 的文件夹中...只有 wwwroot
第二将asp.net核心网站“转换”为类库的正确方法在这里:
所以基本上创建一个asp.net核心Web应用程序项目然后右键单击属性并更改输出类型。
第三次从类库项目开始如果您从 .NET Core 类库项目开始,那么您可以打开 csproj 文件并更改一些内容:
这是我的 csproj 文件现在的样子:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<ApplicationIcon />
<OutputType>Library</OutputType>
<StartupObject />
<EnableDefaultContentItems>true</EnableDefaultContentItems>
</PropertyGroup>
<ItemGroup>
<Content Include="Web\wwwroot\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
因此,基本上更改 Sdk、OutputType、EnableDefaultContentItems 并添加一个 ItemGroup 以强制复制 wwwroot 的所有内容文件。
最后你的代码应该是这样的:
public static void StartApp(string environment)//notice the new parameter
{
var s = Directory.GetCurrentDirectory();
//activate web hosting here
var host = new WebHostBuilder()
.UseEnvironment(environment)//set the environment for debugging mostly
.UseKestrel(o =>
{
o.AllowSynchronousIO = true;
o.ListenAnyIP(5000);
//o.ListenLocalhost(5000);
})
.UseWebRoot(s + "\\Web\\wwwroot")//notice the correct path to client files
//.UseContentRoot(s+"/Web/wwwroot")
.UseStartup<StartUpWeb>()
.Build();
host.Start();
}
您在控制台应用程序中的入口点:
static void Main(string[] args)
{
System.Console.WriteLine("Hello World!");
Test.Start.StartApp("Development");//pass the environment for debugging
System.Console.ReadKey();
}
我对您的代码进行了一些更改。
指定环境调试和加载配置文件等....
还要指定 WebRoot 来查找客户端文件和视图之类的东西(即使它们被编译,它仍然需要一个 webroot)。
这是结果万岁!!
你说对了! 问题是这个配置行:
<Project Sdk="Microsoft.NET.Sdk.Web">
谢谢乔纳森
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.