c# - 在.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 web
3.1 版检查生成的项目文件后,未添加这些引用。对于使用较新版本的 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();
}
}
}
启动.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的文档。
推荐阅读
- termux - msfvenom :command not found 错误出现在 termux
- amazon-web-services - 将文件与事务一起保存在数据库中的正确云等效项是什么?
- odoo - (Odoo) 如何在 v14 中扩展邮件聊天功能?
- azure-devops - 具有代码质量的 Azure Devops 拉取请求修饰
- continuous-integration - 大厅资源`check_every:从不`时间:无效持续时间“从不”
- windows-10 - 为什么 VirtualBox 在 Windows 10 上只有 32 位选项,没有 64 位选项?
- jelastic - n8n 的持久存储
- javascript - 如何在 Vue 中 v-bind 另一个指令(例如 v-model)?
- limit - ThrottleStop Core Utilization 9.3 核心利用率为红色
- javascript - Next Js 错误:元素类型无效:预期为字符串(对于内置组件)或类/函数(对于复合组件)但得到:未定义