从 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
我在 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