【问题标题】:Net Core: how to separate controllers by ports?Net Core:如何按端口分隔控制器?
【发布时间】:2018-09-26 11:32:04
【问题描述】:

我需要通过 netcore2.0 自托管 Web 服务中的端口来分隔控制器。

例子:

有 2 个端口(p1 和 p2)和 3 个控制器(c1、c2、c3)。 需求方案:c1 处理来自 p1 的请求,而 c2 和 c3 将处理来自 p2 的请求。

关于我该怎么做的任何想法?

【问题讨论】:

  • 唯一明显的原因是安全性(阻止某些人群的某些端口,例如内部/外部访问),所以也许只创建两个应用程序更容易,一个使用 C1,一个使用 C1使用 C2+C3?
  • 您对安全性的看法是对的,但在这种情况下,我创建和支持附加服务并不是变体。

标签: c# .net-core asp.net-core-2.0


【解决方案1】:

在 GitHub 上得到答案https://github.com/aspnet/Mvc/issues/8502

[PortActionConstraint(5000)]
public class HomeController : Controller
{
   ...
}

[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 ;
    }
}

【讨论】:

  • 在代理后面运行进程时,此解决方案将不起作用。在简单的 docker 端口映射情况下,它甚至已经失败了。为了验证,构建一个 docker 镜像,使用-p 4000:5000 运行它并通过localhost:4000 访问它,然后查看您的进程在内部端口 5000 上运行记录的 404。
  • 是的,你是对的。 HttpContext.Request.Host.Port 是外部端口。在我们的解决方案中,我们使用 HttpContext.Connection.LocalPort 而不是 HttpContext.Request.Host.Port 和自定义 IActionFilter 而不是自定义属性。它工作正常。我会修复答案
猜你喜欢
  • 2019-04-29
  • 2020-04-15
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多