我有一个基于ASP.NET Core Web API模板的小型沙箱应用程序,其中我try 修改要基于自定义头使用的控制器/操作,为了便于实现,我替换了context.Request.Path属性值.

然而,尽管通过调试确认中间件正在运行,替换条件正在满足,并且值Request.Path已被更改,但应用程序仍在使用控制器和如果路径保持不变将使用的操作.

应用程序的配置为:

using Sandbox.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseMiddleware<ModifyControllerMiddleware>();

app.UseHttpsRedirection();
app.UseAuthorization();

app.MapControllers();

app.Run();

以及中间件本身:

namespace Sandbox.Middleware
{
    public class ModifyControllerMiddleware
    {
        private readonly RequestDelegate _next;

        public ModifyControllerMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            switch (context.Request.Headers["x-intercept"])
            {
                case "1":
                    context.Request.Path = "/Diagnostics/Heartbeat";
                    break;
                case "2":
                    context.Request.Path = "/Diagnostics/Deadbeat";
                    break;
            }

            await _next(context);
        }
    }
}

我到底做错了什么?

总结一下我的期望:

  • With no custom header
    • 用户呼叫URI https://myapplication.com/Diagnostics/Heartbeat
    • 应用程序将请求发送到Diagnostics控制器的Heartbeat动作
  • With the custom header having a value of "2"
    • 用户呼叫URI https://myapplication.com/Diagnostics/Heartbeat
    • 应用程序将请求发送到Diagnostics控制器的Deadbeat动作

然而,实际的行为是,当调用上述URI时,无论自定义头是否存在或值如何,调用的始终是Heartbeat操作,即使我可以看到context.Request.Path has的值已更改.

推荐答案

根据你的描述,你应该在前面加app.UseRouting(); App.MapControlpers,然后修改Conext.Path就可以了.

如下所示:

app.UseMiddleware<ModifyControllerMiddleware>();

app.UseErrorHandler();

app.UseAuthorization();

//add this 
app.UseRouting();

app.MapControllers();

app.Run();

这是我的中间件:

public class ModifyControllerMiddleware
{
    private readonly RequestDelegate _next;

    public ModifyControllerMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        switch (context.Request.Headers["x-intercept"])
        {
            case "1":
                context.Request.Path = "/api/mydata";
                break;
            case "2":

                context.Request.Path = "/GetWeatherForecast";
                //context.Request.Path = "/Diagnostics/Deadbeat";
                break;
        }

        await _next(context);
    }
}

结果:

enter image description here

Csharp相关问答推荐

火鸟DBC驱动程序未加载ADF DLC

访问C#中的数据库字段时获取数据是收件箱错误-为什么?&有效,如果声明不有效

Rx.Net -当关闭序列被触发时如何聚合消息并发出中间输出?

在实际上是List T的 IESEARCH上多次调用First()是否不好?

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

使用命令初始化可绑定属性

C#DateTime.ToString在ubuntu和centos中返回不同的结果

Azure DEVOPS找不到定制的Nuget包

在调整大小的控件上绘制

ASP.NET核心MVC SqlException:违反主键约束';PK_USER';.无法在对象';数据库中插入重复的密钥.用户';

单行上的ReSharper数据标注

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

如何从Azure函数使用Graph API(SDK 5.35)中的[FindMeetingTimes]

如何在Polly重试策略成功之前将HttpClient请求排队?

VS代码扩展无法在新版本扩展C#中运行从v2.10.28开始

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

流畅的验证--如何为属性重用规则?

多个参数的最小API删除

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

C#USB条形码 scanner 在第二次扫描时未写入行尾字符