【问题标题】:Http headers passed from Angular 8 are not appearing in HttpContext in ASP.NET Core API 3.1从 Angular 8 传递的 Http 标头未出现在 ASP.NET Core API 3.1 的 HttpContext 中
【发布时间】:2020-12-17 10:47:35
【问题描述】:

我在 Angular 应用程序中将一些标头值传递给我的 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),我正在检查请求标头,如下所示:

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

context.Request.Headers 列表中不存在标头“xibm-clientid”。

注意:

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

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呢?

我在这里缺少什么吗?

【问题讨论】:

  • 确保在作用域上声明了 httpOptions。应该是 this.httpOptions = ...

标签: asp.net-web-api httpclient angular8 middleware asp.net-core-3.1


【解决方案1】:

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

角度:

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();
        }
    }

结果:

更新:

你在哪里使用中间件?这是一个带有中间件的演示,我可以得到标题(我检查方法是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发送两个请求,一个是option,一个是post,只有post请求有headerxibm-clientid

【讨论】:

  • 感谢依依的回复,但我忘了在我的帖子中提到一件事!我在中间件而不是控制器级别检查此标头。我已经编辑了我的帖子,你可以看看。
  • 我已经更新了我的答案,angular发送了两个请求,一个方法是option,另一个是post,只有post方法有你想要的header,你可以在你的中间件中查看方法和路径,和你可以得到你想要的标题。
  • 谢谢依依,我可能是在OPTIONS里查看的!在 POST 中出现...感谢您的宝贵时间...美好的一天..
猜你喜欢
  • 2021-01-17
  • 2020-09-22
  • 2021-10-14
  • 1970-01-01
  • 2021-05-05
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多