簡體   English   中英

.net 核心應用程序中的自托管 HTTP(s) 端點而不使用 asp.net?

[英]Self hosting HTTP(s) endpoints in .net core app without using asp.net?

我還有一個在 Windows 和 Linux 中運行的 .net 核心應用程序(我使用 .net 核心運行時 >= 2.1)。 為了獲得更好的見解,我想公開一個指標端點(簡單的 HTTP GET 端點),以便 Prometheus 發布我的應用程序的一些內部統計信息。

通過 WWW 和 SO 搜索,我總是最終使用 asp.net 核心。 由於我只想向現有的 .net 核心應用程序添加一個非常簡單的 HTTP GET 端點,因此將整個應用程序移植到 asp.net 似乎有點過頭了。

我已經考慮過的替代方法是基於 HttpListener 編寫我自己的處理程序。 當涉及到一個簡單的 HTTP 端點時,這是非常直接的,但是由於我發現的所有關於 SSL 和 Linux 的信息都是如此,目前不支持這,我應該使用 asp.net。 ( https://github.com/dotnet/runtime/issues/33288#issuecomment-595812935 )

所以我想知道我誤解了什么! 我是唯一一個? 是否已經有一個很好的庫為 .net 核心提供了一個簡單的 http(s) 服務器?

編輯: [已解決]正如@ADyson 在下面的評論中提到的,現有應用程序不需要移植到 asp.net 核心!

在 2.1 版中使用dotnet new web生成的項目文件自動添加了對"Microsoft.AspNetCore.App""Microsoft.AspNetCore.Razor.Design"引用

當我從 .net 核心項目引用我的 asp.net 核心項目並執行托管 Web 服務的代碼時,我最終得到了一個System.IO.FileNotFoundException指出它"Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Core'"

Microsoft.AspNetCore.App是一個元包,也引用了Microsoft.AspNetCore.MVC 因此,執行程序集也必須引用這個元包。 這個觀察誤導了我,使用 asp.net core 會使我的整個應用程序圍繞Microsoft.AspNetCore.App構建。

刪除這些引用並僅添加對"Microsoft.AspNetCore"的引用后,一切都按預期工作。

在 3.1 版中檢查從dotnet new web生成的項目文件后,這些引用沒有被添加。 對於使用較新版本 dotnet 的人來說,這不是問題!

正如@ADyson所提到的,OWIN 是要走的路。 您可以輕松地在現有應用程序中自托管 HTTP 端點。 這是在 .Net Core 3.1 控制台應用程序中自托管它的示例。 它公開了一個簡單的端點,用於使用控制器在端口 5000 上偵聽 GET 請求。 您只需要安裝Microsoft.AspNetCore.Owin Nuget 包。

代碼文件結構如下:

.
├── Program.cs
├── Startup.cs
├── Controllers
    ├── SayHi.cs

程序.cs

using Microsoft.AspNetCore.Hosting;

namespace WebApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseUrls("http://*:5000")
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}

啟動文件

using System.Collections.Generic;
using System.Globalization;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace WebApp
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

賽高

using Microsoft.AspNetCore.Mvc;

namespace WebApp.Controllers
{
    public class SayHi : ControllerBase
    {
        [Route("sayhi/{name}")]
        public IActionResult Get(string name)
        {
            return Ok($"Hello {name}");
        }
    }
}

然后一個簡單的dotnet WebApp.dll將啟動應用程序和 Web 服務器。 如您所見,該示例使用 Kestrel。 默認的網絡服務器。 您可以查看Microsoft的相關文檔。

有關更多配置和路由選項,您可以查看Microsoft的文檔。

一種選擇是使用 EmbeddIo

https://unosquare.github.io/embedio/

我發現文檔並不總是最好的,特別是因為它們最近升級了並且許多示例等都無效。 但是你可以到達那里!

您可以像這樣自托管 REST API:

 WebServer ws = new WebServer(o => o
        .WithUrlPrefix(url)
        .WithMode(HttpListenerMode.EmbedIO))
        .WithWebApi("/api", m => m
        .WithController<ApiController>());

this.Cts = new CancellationTokenSource();
var task = Webserver.RunAsync(Cts.Token);

然后像這樣定義你的 API 控制器。

class ApiController : WebApiController
 {
        public ApiController() : base()
        {

        }

        [Route(HttpVerbs.Get, "/hello")]
        public async Task HelloWorld()
        {
            string ret;
            try
            {
                ret = "Hello from webserver @ " + DateTime.Now.ToLongTimeString();
            }
            catch (Exception ex)
            {
                //
            }
            await HttpContext.SendDataAsync(ret);

        }
}

在 2.1 版中使用dotnet new web生成的項目文件自動添加了對"Microsoft.AspNetCore.App""Microsoft.AspNetCore.Razor.Design"引用,當被 .net 核心項目引用並執行時,它們以System.IO.FileNotFoundException結束System.IO.FileNotFoundException聲明"Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Core'"

在 3.1 版本中使用dotnet new web創建項目不引用這些,因此可以從 .net core 應用程序引用和執行該項目。

-> 使用 asp.net core 對我來說是一個可行的解決方案(再次)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM