我有一个典型的ASP.NET核心应用程序(.NET6),它侦听默认的HTTPS端口并在那里提供主API端点.

我现在想要做的是添加一组只能通过不同的主机和端口访问的端点,例如类似localhost:1234的端点.这是针对一种应该比主API具有更多访问限制的控制平面,在不同的端口上运行它并限制主机将允许完全独立的网络配置来保护它.

这应该与主应用程序运行在相同的进程中,如果此控制平面可以访问该进程的内部状态,则有几个部分会变得容易得多.因此,在我的情况下,仅仅运行一个单独的进程不是一个好的解决方案.

我可以让ASP.NET Core侦听其他端口,但这只是将所有内容结合在一起,并在两个端口上运行相同的端点.我所需要的实际上是在同一应用程序中运行两组不同的端点(理想情况下还有中间件).

如何在ASP.NET Core中实现这一点并进行设置?

推荐答案

嗯,我的第一种方法是使用两个独立的应用程序,它们按照自己的条件运行.您已经提到,其他服务应该访问主应用程序的状态这也是我会避免的(具有进程中状态,这也不利于扩展,具有一些其他缺点),但如果您更喜欢保持当前配置,您可以拥有如下所示:

// start up configuration
 app.MapControllers();

 app.Use(async (ctx, next) =>
 {
     var port = ctx.Request.HttpContext.Connection.LocalPort;
     if (port == 7050)
     {
         // Do not allow FooController
          if (ctx.Request.RouteValues["controller"]?.ToString() == "Foo")
         {
             ctx.Response.StatusCode = 404;
             return; // to prevent the other middlewares to run
         }
     }
     else
     {
         // Allow only FooController
         if (ctx.Request.RouteValues["controller"]?.ToString() != "Foo")
         {
             ctx.Response.StatusCode = 404;
             return; // to prevent the other middlewares to run
         }
     }

     await next(ctx);
 });

 app.Run();

您的设置中的某个位置:

"applicationUrl": "https://localhost:7049;https://localhost:7050;", #launchSettings.json
or
"urls":"https://localhost:7049;https://localhost:7050;" #appSettings.json

Csharp相关问答推荐

数组被内部函数租用时,如何将数组返回给ArrayPool?

. NET Core DB vs JSON模型设计

无法解析数据库上下文的服务

MAUI查询参数单一字符串项将不起作用

使页面内容居中

Blazor EventCallback<;MyType<;T>;>;

在路由中使用枚举

如何在没有前缀和可选后缀的情况下获取Razor Page Handler方法名称?

如何在ASP.NET Core8中启用REST应用程序的序列化?

C#多键字典和TryGetValue

数据库.Migrate在对接容器重启时失败

JsonPath在Newtonsoft.Json';S实现中的赋值

获取混淆&Quot;模糊引用&Quot;错误

两个DateTimeOffset之间的差异返回意外的负值

当我手动停止和关闭系统并打开时,Windows服务未启动

如何在单击按钮后多次异步更新标签

并发表更新.EF核心交易

最小API定义的Swagger标头参数

无法停止PowerShell中的低级挂钩(c#挂钩)

使用c#中的Windows 10关机消息