私は、オブジェクトを編集してデータベースに正常に保存するHttpPut APIメソッドを持っています。これはうまく動作しますが、MVCアプリケーションからは、API Putメソッドを呼び出すために使用するhttpClient.PutAsyncが、API Putメソッドではないにもかかわらず、内部サーバーエラーを返します。なぜこのHttpClient PutAsyncは、正常な更新後に内部サーバーエラーを返します
私は何がうまくいかないのかよくわかりませんが、APIメソッドはうまく動作しますが、何とかMVC HttpClientは内部サーバーエラーを引き続き受けます。
API PUTメソッド
[HttpPut]
public IActionResult Put([FromBody] School school)
{
try
{
var schoolExists = _schoolRepository.SchoolExists(school.Id);
if (!schoolExists) return NotFound();
if (!ModelState.IsValid) return BadRequest();
var schoolData = Mapper.Map<School, Data.School>(school);
var updatedClass = _schoolRepository.UpdateSchool(schoolData);
if (!updatedClass) return Json(GetHttpResponseMessage(HttpStatusCode.InternalServerError));
var route = CreatedAtRoute("GetSchool", school);
return route;
}
catch (Exception e)
{
return LogException(e);
}
}
方法は、上記正常に動作し、私の変更がデータベースに保存され、CreatedAtRouteResultオブジェクトはAPIメソッドから返されます。
MVCのHttpClient
public async Task<T> PutObject(string path, T content, string accessToken)
{
using (var httpClient = new HttpClient())
{
try
{
SetBaseUri(httpClient, accessToken);
var serialisezContent = CreateHttpContent(content);
var httpResponse = await httpClient.PutAsync(path, serialisezContent);
if (httpResponse.StatusCode == HttpStatusCode.InternalServerError) throw new Exception("Problem accessing the api");
return JsonConvert.DeserializeObject<T>(GetResult(httpResponse));
}
catch (Exception ex)
{
throw ex;
}
}
}
上記方法の問題は、依然として内部サーバーエラーを返しvar httpResponse = await httpClient.PutAsync(path, serialisezContent);
このラインである場合です。 POST用に同じ実装があり、うまく動作します。
SETBASEURI()
private void SetBaseUri(HttpClient httpClient, string accessToken)
{
httpClient.BaseAddress = new Uri(BaseUri);
httpClient.DefaultRequestHeaders.Authorization =
_authenticationHeaderValueCreator.CreateAuthenticationHeaderValue("bearer", accessToken);
}
CreateHttpContent()
public ByteArrayContent CreateHttpContent<TParam>(TParam httpObject)
{
var content = JsonConvert.SerializeObject(httpObject);
var buffer = System.Text.Encoding.UTF8.GetBytes(content);
var byteContent = new ByteArrayContent(buffer);
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return byteContent;
}