簡體   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