【发布时间】:2021-11-14 02:37:27
【问题描述】:
我有一个 ASP.NET Core 5 Web API,它为两个应用程序提供一些数据。一个是 Angular SPA,这个设置工作得很好 - Angular 应用程序获取它的数据,可以显示它,一切看起来都很好。
我的另一个应用是带有 Razor 页面的 ASP.NET Core 5 MVC 应用。我可以使用 Microsoft 身份系统和 OpenID Connect 登录 - 用户被正确发现并且一切看起来都很好 - 但是当我进行 API 调用时,我得到了一个“HTTP 406 - Not Acceptable”错误。
根据我的研究,这似乎很可能是由于 API 不匹配而没有提供调用者可以处理的数据类型。这让我很困惑,因为我的 API 提供了 JSON(并且使用 Angular 应用程序,它工作得很好),而我的 MVC 应用程序也需要 JSON - 所以我一直在摸不着头脑,想知道我可能错过了什么...... ..
我的 Web API 是这样设置的(启动/配置服务):
services.AddAuthentication(x => {
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(x => {
x.RequireHttpsMetadata = false;
x.SaveToken = true;
x.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = false,
ValidateIssuer = false,
ValidateAudience = true,
ValidAudience = Configuration.GetValue<string>("AzureAd:Audience"),
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
});
services.AddMvc();
services.AddControllers().AddJsonOptions(options => {
options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
});
及其控制器都在控制器级别指定[Produces("application/json")]注解:
[Route("api/data")]
[ApiController]
[Produces("application/json")]
[Authorize]
public class DataController : MyBaseController
{
// code for the controller
// this is one of the action methods
[HttpGet]
[Route("review")]
public IActionResult GetListForReview()
{
_logger.LogInformation("Get Review List");
IEnumerable<OverviewListDto> data = _repository.GetOverviewListForReview();
return Ok(data);
}
}
所以我认为这是我能做的所有事情,以确保我发送回正确的 JSON。
我的 MVC 应用正在使用 .NET Core 5 HttpClient,我这样设置:
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri(_apiConfig.BaseUrl);
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _apiConfig.AccessToken);
所以我有点期待获取和解析 JSON 应该可以正常工作 - 还是我弄错了?还有什么可能导致这样的“HTTP 406 - Not Acceptable”错误?我还能检查/确保什么?
【问题讨论】:
-
您能分享您尝试访问的端点的签名吗?是否不止一个端点?
-
@BenMatthews:这只是一个简单的
GET请求(GET https://myserver.abc/myapi/ctrl/getdata- 没有参数 - 只是一个简单的调用)。它发生在多个端点上,因此看起来不像是单个端点/ URL 的特定问题。 -
这很奇怪...你能检查一下流量,看看请求中的接受标头是什么吗?
-
请您也展示一下您的 API 操作吗?
-
@Serge:添加了一种方法作为示例——它们看起来都非常相似,基本上都将实际工作委托给存储库类,它只返回一个符合任何标准的 DTO 列表申请任何给定的电话
标签: c# asp.net-core-mvc asp.net-core-webapi asp.net-core-5.0