3

何時間も間違っていることを理解しようとしています。PutAsyncはWeb APIにリクエストを送信しませんが、フィドラーは正常に動作します

Mvcアプリケーションを介してputメソッドがヒットしない場合、リクエストは発生しません。しかし、私がファイトラーでそれをテストすると、APIのPutMethodが動作します。

うまくいけば誰かが私のために物事をクリアすることができます。

また、より良い構造や良いドキュメントのためのポインターを歓迎します。

public void UpdateWerknemerCompetentieDetail(int wnID, int WNC, CompetentieWerknemerDetail detail) 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      string token = (string)HttpContext.Current.Session["token"]; 
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 
      var wn = GetWerknemerById(wnID); 
      //var wnc = wn.CompetentiesWerknemer.Select(c => c).Where(c => c.ID == WNC).FirstOrDefault(); 
      detail.CompetentieWerknemerID = WNC; 
      //wnc.CompetentieWerknemerDetail = detail; 
      var url = String.Format(URL + "PutDetails?id=" + WNC); 
      var json = JsonConvert.SerializeObject(detail, new JsonSerializerSettings() 
      { 
       ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore 
      });   
      var response = client.PutAsync(url, new StringContent(json, Encoding.UTF8, "application/json")); 

     } 
    } 

上記のコードは、APIにリクエストする必要があるサービスです。

ここには、Web APIのIHttpActionResultメソッド(putメソッド)があります。

[Route("PutDetails")] 
    [HttpPut] 
    public IHttpActionResult PutWerknemerCompetentieDetails(int id, [FromBody]CompetentieWerknemerDetail cwn) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (id != cwn.CompetentieWerknemerID) 
     { 
      return BadRequest(); 
     } 

     //_db.Entry(cwn).State = EntityState.Modified; 

     try 
     { 
      _db.CompetentieWerknemerDetail.Add(cwn); 
      _db.SaveChanges(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!WerknemerExist(id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

答えて

4

HttpClient.PutAsyncそれはあなたがawaitする必要があり、将来的に完了します操作を表しTask<HttpResponseMessage>を返し、非同期APIです。 HttpClientusingステートメントの中にラップしています。つまり、非同期PUTをトリガーした直後に、要求とオブジェクトの廃棄で競合状態になるクライアントを処分していることになります。要求の火を見ていない。

2つの選択肢があります。このようWebClientによって公開されたとして、

public async Task UpdateWerknemerCompetentieDetailAsync(
     int wnID, int WNC, CompetentieWerknemerDetail detail) 
{ 
    using (HttpClient client = new HttpClient()) 
    { 
     string token = (string)HttpContext.Current.Session["token"]; 
     client.DefaultRequestHeaders.Authorization = 
       new AuthenticationHeaderValue("Bearer", token); 
     var wn = GetWerknemerById(wnID); 
     //var wnc = wn.CompetentiesWerknemer.Select(c => c) 
     //         .Where(c => c.ID == WNC) 
     //         .FirstOrDefault(); 

     detail.CompetentieWerknemerID = WNC; 
     //wnc.CompetentieWerknemerDetail = detail; 
     var url = String.Format(URL + "PutDetails?id=" + WNC); 
     var json = JsonConvert.SerializeObject(detail, new JsonSerializerSettings() 
     { 
      ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
     });   
     var response = await client.PutAsync(
      url, new StringContent(json, Encoding.UTF8, "application/json")); 

    } 
} 

または同期APIを使用します。方法その中async Taskawaitを作るのいずれか。

+0

ありがとう、私はクライアントが処分されたという事実を忘れてしまい、PutAsyncが完了するまで待つ必要があった。 – Bruno

関連する問題