2016-08-04 5 views
0

データベースにアクセスできるAPIとRestSharpでAPIを呼び出すアプリケーションが1つあります。 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うん、私が投稿した方法が間違っていた。更新:D –

+0

あなたはどのWebサーバーをテストしましたか? IIS/IIS Express? – serhiyb

答えて

2

だから最終的に私は

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; 
} 

(1時間以上、今日、昨日6時間なしの結果を座って、それが動作します)...私の答え自分自身を得たトリックはRequestFormatを追加したとAddBodyAddObjectを変更します:)

+0

私は同様の問題を抱えていますが、私のコントローラはIActionResultを返すので、Task を配置します。 Viewを返す前にタスクが完了するのをメソッドが待つようにする方法を理解することはできません。 –

+1

@RickerSilva私はあなたの問題がasync/awaitの使い方だと思いますか?はいの場合は、別の質問をする必要があると思います。 –