2016-08-04 86 views
0

有一個應用程序,可訪問數據庫的API和一個使用RestSharp調用API的應用程序。 我實現了RestSharp的所有異步方法以通用。所以,GET,POST,DELETE都可以工作。我唯一不能工作的就是PUT。RestSharp異步PUT

這一切首先是我的控制器PUT:

[HttpPut("{id}")] 
public void Put(int id, [FromBody]ApplicationUser value) 
{ 
    string p = value.Email; 
} 

這是我的方法:

public Task<bool> PutRequestContentAsync<T>(string resource, object id, T resourceObject) where T : new() 
    { 
     RestClient client = new RestClient("http://localhost:54008/api/"); 
     RestRequest request = new RestRequest($"{resource}/{{id}}", Method.PUT); 
     request.AddUrlSegment("id", id); 
     request.AddObject(resourceObject); 
     var tcs = new TaskCompletionSource<bool>(); 

     var asyncHandler = client.ExecuteAsync<T>(request, r => 
     { 
      tcs.SetResult(r.ResponseStatus == ResponseStatus.Completed); 
     }); 

     return tcs.Task; 
    } 

,這是我的視圖(調用GET的所有其他呼叫,...工作正常):

bool putOk = await new RepositoryCall() 
    .PutRequestContentAsync("Values", 2, 
     new ApplicationUser { 
      Email="[email protected]" 
     } 
    ); 

與調試,響應狀態Completed但PUT永遠不會被調用。

任何想法可能是什麼問題?

+2

您指的是PUT,但您的存儲庫調用反映DELETE。可能你複製粘貼錯誤的一段代碼。 – serhiyb

+0

@serhiyb yep,是我發佈的錯誤方法。已更新:D –

+0

您測試過哪個Web服務器? IIS/IIS Express? – serhiyb

回答

2

所以最後我得到了我的答案我自己......(昨天坐6小時沒有結果,越來越多的一小時,它的工作原理)

public Task<bool> PutRequestContentAsync<T>(string resource, object id, T resourceObject) where T : new() 
{ 
    RestClient client = new RestClient("http://localhost:54008/api/"); 
    RestRequest request = new RestRequest($"{resource}/{{id}}", Method.PUT); 
    request.AddUrlSegment("id", id); 

    request.RequestFormat = DataFormat.Json; 
    request.AddBody(resourceObject); 

    var tcs = new TaskCompletionSource<bool>(); 

    var asyncHandler = client.ExecuteAsync<T>(request, (response) => { 
     tcs.SetResult(response.ResponseStatus == ResponseStatus.Completed); 
    }); 
    return tcs.Task; 
} 

的訣竅是添加RequestFormat和不斷變化的AddObjectAddBody :)

+0

我有類似的問題,但我的控制器返回一個IActionResult,所以我把任務。但無法弄清楚如何在返回View之前讓方法等待任務完成。 –

+1

@RickerSilva我認爲你的問題是如何使用async/await?如果是的話,我認爲你需要開始另一個問題。 –