首页 > 解决方案 > 在.net核心应用程序中自托管HTTP(s)端点而不使用asp.net?

问题描述

我也有一个在 Windows 和 Linux 中运行的 .net 核心应用程序(我使用 .net 核心运行时 >= 2.1)。为了获得更好的见解,我想公开一个指标端点(简单的 HTTP GET 端点),以便 Prometheus 发布我的应用程序的一些内部统计信息。

搜索万维网,所以我总是最终使用 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 核心!

dotnet new web在 2.1 版中生成的项目文件自动添加了对"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"一切都按预期工作。

dotnet new web3.1 版检查生成的项目文件后,未添加这些引用。对于使用较新版本的 dotnet 的人来说,这不是问题!

标签: c#ssl.net-corehttplistener

解决方案


正如@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();
        }
    }
}

启动.cs

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();
            });
        }
    }
}

SayHi.cs

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将启动应用程序和网络服务器。如您所见,该示例使用 Kestrel。默认网络服务器。你可以查看微软的相关文档。

有关更多配置和路由选项,您可以查看Microsoft的文档。


推荐阅读