Самостоятельно размещенный веб-API In Process с ядром Dot Net - PullRequest
4 голосов
/ 24 сентября 2019

Я пытаюсь выяснить вероятность перехода на ядро ​​с точечной сетью, сейчас выпущен 3.0.Один из наших ключевых компонентов позволяет нашим (частным) нюгетам создавать свои собственные WebAPI, предоставляя события и методы потребителю.Это поддерживает такие функции, как управление удаленными службами или настройка удаленных служб, позволяя API предоставлять настройки / извлечение удаленных настроек и т. Д.

Эта функциональность является ключевой для работы нашей архитектуры микросервисов.

Я пытаюсь повторить это с ядром dotnet, однако я изо всех сил пытаюсь найти прямой эквивалентный учебник / сценарий.Мы по сути следовали процессу, подробно описанному здесь:

https://docs.microsoft.com/en-us/aspnet/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

Однако, после проверки совместимости пакетов nuget (и все выглядит нормально ..)Теперь я просто получаю исключение нулевой ссылки при вызове WebApp.Start<Startup>(baseaddress);

Исключение нулевой ссылки, очевидно, вызывается несовместимостью пакетов nuget с ядром .net, см. Здесь:

NullReferenceException, с которым столкнулся Owin при запуске .Net Core 2.0 - Настройки?

Решение, приведенное в ссылке, является односторонним, но использует стороннее приложение - NancyFx.Есть ли способ реализовать ту же функциональность с ядром dotnet в его нынешнем виде?Раньше было достаточно документации для самостоятельного хостинга, но, к сожалению, учитывая, что ядро ​​aspnet работает в своем собственном процессе, найти решение очень сложно!

Кто-нибудь может указать мне правильное направление здесь?

Код показан ниже

//the external library would contain all this code. I.e. this could present the configuration endpoints as mentioned above.

public class Startup
{
    // This code configures Web API. The Startup class is specified as a type
    // parameter in the WebApp.Start method.
    public void Configuration(IAppBuilder appBuilder)
    {
        // Configure Web API for self-host. 
        HttpConfiguration config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        appBuilder.UseWebApi(config);
    }
}

public class WebAPI:IDisposable
{
    private IDisposable _webApp;
    public WebAPI()
    {
        string baseAddress = "http://localhost:8800/";
        _webApp = WebApp.Start<Startup>(baseAddress); // << This line throws null reference exception 
    }
    #region IDisposable Support
    private bool disposedValue = false; // To detect redundant calls

    protected virtual void Dispose(bool disposing)
    {
        if (!disposedValue)
        {
            if (disposing)
            {
                _webApp.Dispose();
                _webApp = null;
            }                
            disposedValue = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
    }
    #endregion
}

public class ValuesController:ApiController
{
    // GET api/values 
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5 
    public string Get(int id)
    {
        return "value";
    }
}

Основное приложение, хост / потребитель указанной выше библиотеки.

class Program
{
    static void Main()
    {
        var webapi = new WebApiTest.WebAPI();
        Console.WriteLine("Running...");
        Console.ReadLine();
        webapi.Dispose();
    }
}
...