Размещение нескольких API продуктов в одной базовой ASP.NET-службе WebAPI - PullRequest
1 голос
/ 24 мая 2019

Я разрабатываю веб-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, пожалуйста, помогите мне, если это достижимо или нет. Заранее спасибо.

1 Ответ

1 голос
/ 27 мая 2019

Обходной путь - добавить пользовательское ограничение на контроллер 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
...