0

使用 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;
        }
    }
4

0 回答 0