从 Angular 8 传递的 Http headers 没有出现在 ASP.NET Core API 3.1 的 HttpContext 中

Http headers passed from Angular 8 are not appearing in HttpContext in ASP.NET Core API 3.1

我在 Angular 应用程序中将一些 header 值传递给我的 API 调用:

httpOptions = {
    headers: new HttpHeaders({
      "Content-Type": "application/json",
      "Access-Control-Allow-Origin": "*",
      "xibm-clientid": "Test"
    })
  };


submitSomething(myData: IMyData): Observable<any> {
    return this.httpClient
      .post<any>(apiURL, JSON.stringify(myData), this.httpOptions)
      .pipe(catchError(this.errorHandler));
  }

请求被重定向到我的后端API(ASP.NET 3.1 Core API),我正在检查请求header如下:

string apicClientId = context.Request.Headers["xibm-clientid"].ToString();

header“xibm-clientid”不在 context.Request.Headers 列表中。

注:

我正在自定义中间件而不是控制器级别检查此 header:

public class CheckHeadersMiddleware
{
    private readonly RequestDelegate _next;
    
    public CheckHeadersMiddleware(RequestDelegate next)
    {
        _next = next ?? throw new ArgumentNullException(nameof(next));
    }

    public async Task Invoke(HttpContext context)
    {
        string apicClientId = context.Request.Headers["xibm-clientid"].ToString();
    }
}

我可以在 header 到达控制器时读取它,但我不想这样做,因为我想在调用控制器之前检查 header。那么为什么 header 没有出现在中间件级别?

我在这里遗漏了什么吗?

你可以尝试使用Request.Headers["xibm-clientid"].ToString();。这里有一个演示:

angular:

httpOptions = {
    headers: new HttpHeaders({
      "Content-Type": "application/json",
      "Access-Control-Allow-Origin": "*",
      "xibm-clientid": "Test"
    })
  };



    return this.httpClient
      .post<any>("https://localhost:xxx/Api", 1, this.httpOptions);
  }

Api 控制器:

[ApiController]
    [Route("[controller]")]
    public class ApiController : ControllerBase
    {
        public IActionResult Index()
        {
            var s = Request.Headers["xibm-clientid"].ToString();
            return Ok();
        }
    }

结果:

更新:

你在哪里使用中间件?这里有一个中间件的演示,我可以得到header(我检查了方法是post,我检查了RequestPath):

中间件:

public class CheckHeadersMiddleware
    {
        private readonly RequestDelegate _next;

        public CheckHeadersMiddleware(RequestDelegate next)
        {
            _next = next ?? throw new ArgumentNullException(nameof(next));
        }

        public async Task Invoke(HttpContext context)
        {
            if (context.Request.Path == "/Api" && context.Request.Method == "POST")
            {
                string apicClientId = context.Request.Headers["xibm-clientid"].ToString();
            }
            await _next(context);
        }
    }

结果:

angular 发送两个请求,一个方法是选项,另一个是post,只有post请求有header xibm-clientid