C# HttpClient возвращает 415 неподдерживаемый тип носителя по запросу исправления - PullRequest
1 голос
/ 16 апреля 2020

У нас есть .netcore 3.1 ApiController с конечной точкой, прослушивающей запросы PATCH, и определен тестовый сервер, который мы используем для тестов интеграции / API.

Запрос PATCH, отправленный с помощью Postman, работает отлично, но запросы, отправленные через HttpClient в тестах XUnit, не выполняются с 415. Неподдерживаемый тип носителя.

Запрос исправления почтальона: нет никаких определенных c заголовков, кроме токена Bearer и Content-Type: "application / json"

В тестах мы используем WebApplicationFactory и его factory.CreateClient () для нашего HttpClient.

С сериализацией Json не должно быть проблем, так как я просматривал содержимое через отладчик и похоже, что он сериализован очень хорошо.

Кроме того, наши методы POST работают полностью из коробки с этим точно таким же кодом (замена «PATCH» на «POST» et c)

Ждем несколько советов. Также, если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Большое спасибо.

Контроллер:

[HttpPatch("{id}")]
public async Task<ActionResult<Unit>> Edit(Edit.Command request)
{
     return await Mediator.Send(request);
}

Команда:

public class Command : IRequest
{
      public string Id { get; set; }

      public JsonPatchDocument<ObjectDTO> PatchDocument { get; set; }
}

Тест:

[InlineData(/* inline data goes here */)]
public async void TestEdit_Ok(/* required parameters for the test */)
{
    var request = new HttpRequestMessage(new HttpMethod("PATCH"), url));
    request.Headers.Add("Authorization", "Bearer " + token);

    /* create patch document logic goes here */

    var command = new Command()
    {
          Id = target,
          PatchDocument = patchDocument,
    };

    _testHelper.AddJsonContent(request, command);

    // Act
    var response = await _client.SendAsync(request);

    // Assert
    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}

Где вспомогательный метод AddJsonContent определяется как:

public void AddJsonContent(HttpRequestMessage request, object content)
{
      request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      string serializedContent = JsonConvert.SerializeObject(content);
      request.Content = new StringContent(serializedContent, Encoding.UTF8, "application/json");
}
...