[英]Filtering connections on my ASP.NET Core sever between Razor/MVC and gRPC, depending on Kestrel endpoint
在我的 .NET 6 ASP 应用程序中,我计划公开 3 种类型的网络端点:
公共部分(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
方法?有大约 3 种方法可以做到这一点(还有更多,但让我们从这里开始):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.