Kestrel 服务器:如何将不同的端口绑定到不同的控制器?

sch*_*han 5 kestrel-http-server asp.net-core

Kestrel 有没有办法监听 2 个端口,例如 80 和 81,并为每个端口指定不同的控制器?

我的情况是有 2 个控制器,一个用于需要基于令牌的身份验证的最终用户请求,另一个控制器用于基于机器的代理,我想在其中强制执行基于客户端证书的身份验证。

Nev*_*ane -1

我仍然觉得设置两个单独的应用程序会更干净且更易于管理。您始终可以分离出您需要的任何内容(例如,在您的情况下,您可以设置不同的身份验证),并且可以在它们之间共享任何类型的代码,包括控制器、服务和中间件。

但是,如果您想将其放在同一个应用程序中,您可以尝试使用中间件。据我所知,MVC 中间件主要只提供对路由的访问,而不是端口的访问。UseMvc但是,您可以在重置路径之前添加中间件。像这样的东西:

app.Use(async (context, next) => {
    if (context.Connection.LocalPort == 80)
        context.Request.Path = "/ports/80" + context.Request.Path.Value;
    await next();
});
Run Code Online (Sandbox Code Playgroud)

执行此操作后,您可以查看区域来组织控制器以进行路由。https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/areas。您必须确保所有端口都具有此映射,以确保最终用户无法对此类路径进行硬编码。

  • 以下是不同端口上不同控制器的用例:运行状况检查和指标放置在与最终用户 API 不同的服务端口上。那么这个服务端口就不会暴露在托管集群之外。 (2认同)