2016-03-23 28 views
3

我一直在試圖弄清楚現在幾個小時出了什麼問題,而我無法找到問題所在。PutAsync不會向web api發送請求,但提琴手可以正常工作

通過Mvc應用程序put方法沒有被擊中,請求不會發生。但是當我在提琴手中測試它時,PutMethod在API中起作用。

希望有人能爲我解決問題。

也歡迎爲更好的結構或一些良好的文檔指針。

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是一個異步API,它返回一個Task<HttpResponseMessage>代表的操作,這將在未來,您需要await完成。你在using聲明中包裝你的HttpClient,這意味着在你觸發異步PUT之後,你正在處理引起與請求和處理對象競爭條件的客戶端,這可能是你「沒有看到請求火災。

你有兩種選擇。將該方法async Taskawait裏面:

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,如暴露的WebClient

+0

非常感謝,我忘記了這個事實,即客戶端被拋棄了,我需要等待PutAsync完成。 – Bruno

相關問題