[英]Identity on ASP.NET Core(3.0) not functioning when using endpoints
[英]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.