[英]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
作為路由部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.