Размещение API нескольких продуктов в одной службе ASP.NET Core WebAPI.

Я разрабатываю веб-API на основе ASP.NET Core, который должен поддерживать несколько вариантов моего продукта, скажем, на основе лицензии или разновидности, на которую он был установлен.

Вместо того, чтобы использовать несколько сервисов для каждого типа продукта, я подумал об одном сервисе, который содержит несколько конечных точек или URL-адресов. Я сделаю это настраиваемым в appsettings.json во время установки.

Мне известны UseUrls при создании WebHost, но могу ли я связать определенный URL-адрес в наборе URL-адресов с определенными контроллерами?

Код:

WebHost.CreateDefaultBuilder(args)
.UseUrls("http://localhost:5000;http://localhost:5001;https://localhost:5002")

Ожидать

https://localhost:5000/ --> Product1Controller
https://localhost:5001/ --> Product2Controller
https://localhost:5002/ --> Product2Controller

Я новичок в ASP.NET Core, пожалуйста, помогите мне, достижимо это или нет. Заранее спасибо.


person Sathish Guru V    schedule 24.05.2019    source источник
comment
вы должны использовать только одну конечную точку, а варианты продукта — это просто свойство вашей модели дизайн API   -  person Alexandre Rodrigues    schedule 24.05.2019


Ответы (1)


Обходной путь — добавить пользовательское ограничение на контроллер API, который включен с определенным портом.

1. Создайте класс PortActionConstraint:

[AttributeUsage(AttributeTargets.Class)]
public class PortActionConstraint : ActionMethodSelectorAttribute
{
    public PortActionConstraint(int port)
    {
        Port = port;
    }

    public int Port { get; }

    public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
    {
        //external port
        var externalPort = routeContext.HttpContext.Request.Host.Port;
        //local port 
        var localPort = routeContext.HttpContext.Connection.LocalPort;
        //write here your custom logic. for example  
        return Port == localPort;
    }
}

2. Добавьте атрибут с соответствующим номером порта на всех контроллерах, например

[PortActionConstraint(5000)]
[Route("api/[controller]")]
[ApiController]
public class Product1Controller : ControllerBase
person Ryan    schedule 27.05.2019
comment
Спасибо. Это сработало. Теперь я делаю другой способ, используя ваше решение :) - person Sathish Guru V; 27.05.2019