使用 Refit 库从其他 API 调用 API 时出现奇怪的错误。
仅供参考:我的 API 是使用 .Net 5 构建的。
第一个 API 返回 200 响应,它只是无法显示响应的改装。
我已经检查了兼容的响应和模型的类型。
第一个 API
端点声明:
[Get("/projects/private/list")]
[Headers("Authorization: Bearer")]
Task<List<ProjectsResponse>> GetProjects([Body] ProjectsRequest projectIds);
定义:
[HttpGet("private/list")]
[ProducesResponseType(statusCode: (int)HttpStatusCode.OK, type: typeof(IEnumerable<ProjectsResponse>))]
public async Task<IActionResult> GetProjects([FromBody] ProjectsRequest request)
{
IEnumerable<Project> projects = await _mediator.Send(new GetProjectsQuery { ProjectIds = request.ProjectIds });
return Ok(_mapper.Map<List<ProjectsResponse>>(projects));
}
请求模型:
public class ProjectsRequest
{
public string[] ProjectIds { get; set; }
}
响应模型:
public class ProjectsResponse
{
public string Id { get; set; }
public string Name { get; set; }
}
第二个 API
来电:
List<ProjectsResponse> projects = await _otherApi.GetProjects(new ProjectsRequest
{
ProjectIds = projectIds.ToArray()
});
基本上我在响应中返回导致此问题的对象列表。
奇怪的行为是,当我记录它时Request.Content它工作正常,但是当日志被删除时,502 错误开始弹出。
所以,当我添加_logger.LogInformation("Request:{data}", await request.Content.ReadAsStringAsync());一切正常但当它被删除时,改装开始抛出 502。
我已经使用DelegatingHandlerRefit 完成了令牌处理。
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
try
{
var token = await GetAccessTokenAsync();
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
//_logger.LogInformation("Request:{data}", await request.Content.ReadAsStringAsync());//Uncommenting this line makes it work.
HttpResponseMessage httpResponseMessage = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
//_logger.LogInformation("Response:{data}", await httpResponseMessage.Content.ReadAsStringAsync());
return httpResponseMessage;
}
catch (ApiException ex)
{
_logger.LogError(ex, ex.Message);
throw;
}
}