Самостоятельный хостинг конечных точек HTTP (s) в базовом приложении. net без использования asp. net? - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть приложение ядра. net, работающее также в Windows и Linux (я использую. net время выполнения ядра> = 2.1). Чтобы лучше понять, я хотел бы предоставить конечную точку метрик (простая конечная точка HTTP GET) для Прометея, публикующего некоторые внутренние статистические данные моего приложения.

Поиск по WWW and ТАК я всегда использовал asp. net ядро. Поскольку я только хочу добавить довольно простую конечную точку HTTP GET к существующему базовому приложению. net, кажется немного излишним, портировать все приложение на asp. net.

Альтернатива Я уже подумал, чтобы написать свой собственный обработчик на основе HttpListener. Это довольно просто, когда дело доходит до простой конечной точки HTTP, но, поскольку вся информация, которую я нашел относительно SSL и Linux, была, это не поддерживается на данный момент, и мне следует go с asp. net. (https://github.com/dotnet/runtime/issues/33288#issuecomment -595812935 )

Так что мне интересно, что я не так понял! Я один такой? Уже есть хорошая библиотека, предоставляющая простой http (s) сервер для. net core?

EDIT: [решено] Как @ADyson, упомянутый в комментариях ниже, существующее приложение делает не нужно переносить на asp. net core!

Файлы проектов, созданные с помощью dotnet new web в версии 2.1, автоматически добавляют ссылки на "Microsoft.AspNetCore.App" и "Microsoft.AspNetCore.Razor.Design"

Когда я ссылался на мой основной проект asp. net из основного проекта. net и выполнял код, на котором размещен веб-сервис. В итоге я получил System.IO.FileNotFoundException с указанием "Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Core'".

Microsoft.AspNetCore.App метапакет также ссылается на Microsoft.AspNetCore.MVC! Таким образом, исполняющая сборка также должна ссылаться на этот метапакет. Это наблюдение поразило меня, что использование ядра asp. net делает все мое приложение построенным вокруг Microsoft.AspNetCore.App.

После удаления этих ссылок и добавления только ссылки на "Microsoft.AspNetCore" все работает как положено.

После проверки сгенерированных файлов проекта из dotnet new web в версии 3.1 эти ссылки не были добавлены. Это не проблема для людей, использующих более новые версии do tnet!

Ответы [ 3 ]

2 голосов
/ 02 апреля 2020

Как упоминается @ ADyson , OWIN - это путь к go. Вы можете легко самостоятельно разместить конечную точку HTTP в существующем приложении. Вот пример для самостоятельного размещения его в консольном приложении. Net Core 3.1. Он предоставляет простую конечную точку прослушивания порта 5000 для запросов GET с использованием контроллера. Все, что вам нужно, это установить пакет Microsoft.AspNetCore.Owin Nuget.

Структура файлов кода выглядит следующим образом:

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

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

Startup.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 .

Дополнительные параметры конфигурации и маршрутизации можно найти в документации Microsoft .

2 голосов
/ 02 апреля 2020

Один из вариантов - использовать EmbeddIo

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

Я считаю, что документация не всегда самая лучшая, особенно в связи с тем, что она недавно обновлялась, и многие образцы и т.д. c. не действительны. Но вы можете туда добраться!

Вы можете самостоятельно разместить 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);

        }
}
1 голос
/ 02 апреля 2020

Файлы проектов, сгенерированные с помощью dotnet new web в версии 2.1, автоматически добавили ссылки на "Microsoft.AspNetCore.App" и "Microsoft.AspNetCore.Razor.Design", которые при обращении к основному проекту. net и выполнению приводили к System.IO.FileNotFoundException с указанием "Could not load file or assembly 'Microsoft.AspNetCore.Mvc.Core'" .

Создание проекта с dotnet new web в версии 3.1 не ссылается на них, поэтому на проект можно ссылаться и выполнять из основного приложения. net.

-> Использование ядра asp. net - жизнеспособное решение для меня (опять же)!

...