0

私は、オブジェクトを編集してデータベースに正常に保存する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; 
    } 

答えて

0

私はあなたのAPIのPutメソッドが実際にメッセージNo route matches the supplied valuesとHTTP 500エラーを返します賭けます。あなたはフィドラーでそれをチェックすることができます。

そして問題は、次の行である:

var route = CreatedAtRoute("GetSchool", school);

CreatedAtRoute方法は、最初の引数としてルート名を取ります。 GetSchoolという名前のルートがあるとは思わない。むしろ同じコントローラ内のアクション名です。 CreatedAtRouteは未知のルートの例外をスローしません。ただ500のエラーコードを返します。

、この問題を修正する代わりにCreatedAtRouteCreatedAtActionメソッドを使用するには:

var route = CreatedAtAction("GetSchool", school); 
0

私はこの問題は、APIからの結果をシリアル化するために失敗しているということだと思います。単体テストで自分で結果を手動でシリアル化し、失敗した箇所を確認してください。

関連する問題