繁体   English   中英

ASP net core MVC - 在库中启动 Web 应用程序

[英]ASP net core MVC - Start Web application in a library

我需要从控制台项目启动一个使用 Kestrel 自行托管的 Web 应用程序。 Web 应用程序位于库中。 我有两个项目的解决方案,即:

  • --APP.Console.exe(dotnet core 3.1 控制台应用程序)
  • --APP.WebSite(dotnet core 3.1 类库)

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM