簡體   English   中英

C# HttpClient 在補丁請求中返回 415 Unsupported media type

[英]C# HttpClient returns 415 Unsupported media type on Patch request

我們有一個 .netcore 3.1 ApiController,其端點監聽 PATCH 請求,並定義了一個用於集成/API 測試的測試服務器。

使用 Postman 發送的 PATCH 請求工作正常,但通過 XUnit 測試中的 HttpClient 發送的請求失敗,並出現 415 Unsupported media type。

Postman 補丁請求:除了不記名令牌和內容類型之外沒有特定標頭:“應用程序/json”

在測試中,我們使用 WebApplicationFactory,它是我們的 HttpClient 的 factory.CreateClient()。

Json 序列化不應該是一個問題,因為我通過調試器查看了內容,並且它似乎被序列化得很好。

此外,我們的 POST 方法使用完全相同的代碼完全開箱即用(將“PATCH”替換為“POST”等)

期待一些建議。 另外,如果您需要更多信息,請告訴我。 非常感謝。

Controller:

[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");
}

只是想說,雖然我看到這是一個已確認的錯誤,但我認為一旦我們在客戶端使用完整的 url (http://localhost:PORT/endpoint) 而不僅僅是 (/endpoint),我們就沒有遇到這個問題了。 這與 github 問題的建議解決方法之一相同。

我看到 Vadim 鏈接的票證仍處於打開狀態,因此這可能會為你們中的某些人解決問題。

謝謝您的幫助。

問題在 Asp.Net Core 5.0 中得到確認(我確認的問題——我和主題啟動器有同樣的問題)

當將 xUnit 與 WebApplicationFactory 和 factory.CreateClient() 用於 HttpClient 時,PATCH 方法返回“415 Unsupported Media Type”狀態。

不同組合中的所有可能嘗試都會導致 415 狀態。

但是,Swagger 和 Postman 等其他方法可以很好地與 PATCH 方法配合使用。

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

最后,為了進行測試,我們使用 POST 方法進行了解決,其中包含/with-partial-update作為路由部分。

將此錯誤報告給 aspnetcore 存儲庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM