在单个ASP.NET Core WebAPI服务中托管多个产品API

时间:2019-05-24 07:54:44

标签: c# asp.net-core .net-core asp.net-core-webapi asp.net-core-2.2

我正在设计一个基于ASP.NET Core的Web API,该API需要支持我产品的多个变体,比如说基于许可证或所安装产品的变体。

我没有考虑为每种类型的产品提供多种服务,而是想到了一种包含/托管多个端点或URL的服务。安装时,我将在appsettings.json中对此进行配置。

我知道创建WebHost时的UseUrls,但是我可以将一组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的新手,如果可以实现,请帮助我。 预先感谢。

1 个答案:

答案 0 :(得分: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