繁体   English   中英

过滤 Razor/MVC 和 gRPC 之间的 ASP.NET Core 服务器上的连接,具体取决于 Kestrel 端点

[英]Filtering connections on my ASP.NET Core sever between Razor/MVC and gRPC, depending on Kestrel endpoint

在我的 .NET 6 ASP 应用程序中,我计划公开 3 种类型的网络端点:

  • Razor 基于页面的 web UI,侦听 TCP 端口或 Z6EC1BD1EA6A5D672BDDD63B20C8ZF67 套接字
  • 公共 gRPC API,同时监听 TCP 或 Unix 套接字
  • 服务器管理 gRPC API 仅供内部使用,出于安全原因仅在 Unix 套接字上侦听

公共部分(Razor 和公共 gRPC)可以在反向代理后面使用,这就是为什么我计划同时允许 TCP 和 Unix sockets(如果它们的代理在同一台机器上)。 我还需要将它们全部放在同一个主机中,这样它们就可以访问相同的服务(相同的实例,而不仅仅是以类似方式配置的服务),因此我也可以注册常规的托管服务。 最后,由于 Microsoft 和 gRPC 文档都说使用Grpc.Core ,我不想使用它,即使它可以完全解决我的问题。

由于单个通用主机内不可能有多个 WebHost,所以我现在最好的选择是依靠MapWhen来根据哪个端点接收到连接来引导请求。 但是,我对MapWhen谓词的唯一数据使用IPAddress class (通过HttpContext.Connection )指示连接源,它不能代表 Unix 套接字,所以我不能用它来可靠地识别连接源。

如果我 go MapWhen路线,代码将具有以下结构:

public void KestrelSetupCallback(KestrelServerOptions options) {
    // The two *Endpoint below are either IPEndpoint or UnixSocketEndpoint
    // obtained from app configuration
    options.Listen(razorEndpoint, o => o.Protocols = HttpProtocols.Http1AndHttp2);
    options.Listen(apiEndpoint, o => o.Protocols = HttpProtocols.Http2);
    options.ListenUnixSocket(managementSocketPath, o => o.Protocols = HttpProtocols.Http2);
}

public void WebappSetupCallback(IApplicationBuilder app) {
    // Additional middlewares can be added here if needed by the predicates
    app.MapWhen(RazorPredicate, RazorSetupCallback);
    app.MapWhen(ApiPredicate, ApiSetupCallback);
    app.MapWhen(ManagementPredicate, ManagementSetupCallback);
}

我发现了ListenOptions.Use方法,我可以在每个端点的ListenOptions上调用该方法来添加一个连接中间件,该中间件将设置一个识别端点的功能。 我不确定这是否可能(如果此时IFeatureCollection是可写的),我想知道是否还有其他选择。

  • 考虑到我的用例,这种方法可行吗? 我需要更改代码结构吗?
  • 除此之外,我可以采取什么方法来实现*Predicate方法?
  • 有没有更好的替代方法来实现我的用例? 这对我来说感觉很 XYZ 问题,我害怕错过专门为此设计的功能。

有大约 3 种方法可以做到这一点(还有更多,但让我们从这里开始):

  • 像上面那样拆分管道。 使用 MapWhen 来确定哪些条件应该运行哪个分支
  • 您可以在端点/控制器等上使用RequireHost来确定哪些将根据传入主机匹配。
  • 您可以在同一进程中启动多台主机,并将它们视为独立的岛屿。 他们将有单独的配置、DI、日志记录等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM