C# HttpClient 在补丁请求上返回 415 不支持的媒体类型

mee*_*ree 5 c# patch http-status-code-415 json-patch asp.net-core-3.1

我们有一个 .netcore 3.1 ApiController,其端点侦听 PATCH 请求,并定义了一个用于集成/API 测试的测试服务器。

使用 Postman 发送的 PATCH 请求工作得很好,但在 XUnit 测试中通过 HttpClient 发送的请求失败,并显示 415 不支持的媒体类型。

邮递员补丁请求:除了承载令牌和内容类型之外没有特定标头:“application/json”

在测试中,我们使用 WebApplicationFactory 及其 HttpClient 的factory.CreateClient()。

这不应该是 Json 序列化的问题,因为我通过调试器查看了内容,它似乎序列化得很好。

此外,我们的 POST 方法完全开箱即用,使用完全相同的代码(将“PATCH”替换为“POST”等)

期待一些建议。另外,如果您需要更多信息,请告诉我。多谢。

控制器:

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

命令:

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

      public JsonPatchDocument<ObjectDTO> PatchDocument { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

测试:

[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);
}
Run Code Online (Sandbox Code Playgroud)

其中辅助方法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");
}
Run Code Online (Sandbox Code Playgroud)

Vad*_*oda -1

该问题在Asp.Net Core 5.0中得到确认\n(该问题已被我确认\xe2\x80\x94 我和主题启动者有同样的问题)

\n

当将 xUnit 与 WebApplicationFactory 和 HttpClient 的factory.CreateClient() 一起使用时,PATCH 方法返回“415 不支持的媒体类型”状态。

\n

不同组合中的所有可能尝试都会导致 415 状态。

\n

然而,Swagger 和 Postman 等其他方法可以很好地与 PATCH 方法配合使用。

\n

只有 xUnit(或 WebApplicationFactory)PATCH 方法失败。

\n

最后,为了进行测试,我们使用 POST 方法做了一个解决方法,其中包含/with-partial-update作为路由部分。

\n

此错误已报告给 aspnetcore 存储库

\n