2012-10-23 16 views
18

私はAsp.Net MVC 4プロジェクトを行っていて、私たちのAPIサービスへの内部リクエスト(プロキシなど)を探しています。FormCollectionからのデータを使用して非同期HttpClientポストリクエストを作成する

これは、私のコントローラでのインデックスメソッドの外観です。私はPostAsyncの部分で立ち往生しています。

[HttpPost] 
public async Task<ActionResult> Index(FormCollection body){ 

    HttpClient httpClient = new HttpClient(); 
    httpClient.BaseAddress = new Uri("http://myapi.com"); 

    // posts to http://myapi.com/users 
    var response = await httpClient.PostAsync("users", body); 

    if(response.isSuccessStatusCode) return Json(new { 
     status = true, 
     url = response.Content.Url 
    }); 
} 

"application/x-form-urlencoded" "body"コンテンツをPostAsync POSTメソッドに渡したいとします。しかし、 "body is not type HttpContent"というエラーが表示されます。

キャストまたは変換できません。今何?

私がここで間違っていることを教えてください。

エリック

+0

'FormCollection'と' HttpContent'は完全に異なるタイプです。なぜあなたのコードが(キャストの有無に関わらず)動作すると期待しますか?あなたがする必要があるのは、 'FormCollection'のデータに基づいて新しい' HttpContent'を作成することです。 – svick

+0

そうですね、上でやるべきことを説明しようとしています。私は簡単な答えよりも歩き回りを探しています。 @svick、FormCollectionのデータセットに基づいて新しいHttpContentを作成する例がありますか? – Erik5388

答えて

33

私はあなたが何をしようとして全くわからないんだけど、おそらく辞書にFormCollectionを変換しFormUrlEncodedContentクラスを使用すると、あなたが探しているものです。

例えば:

var response = await httpClient.PostAsync("users", 
              new FormUrlEncodedContent(
               body. 
                AllKeys.ToDictionary(
                 k => k, v => body[v]))); 
+1

今回、私はMultipartFormDataContentを使ってこれをやろうとしていて、失敗していました。私のリクエストでFormUrlEncodedContentを使用するだけで、魅力的に機能します。ありがとう! – killthrush

+0

データをHttpContentに変換する方が良いのですか?またはHttpContentだけ別の辞書ですか? – Erik5388

+1

@ Erik5388 HttpContentは抽象基本クラス*だと思います。それをインスタンス化することはできません。代わりに、あなたはそれを継承する具体的なクラス..を必要とします。FormUrlEncodedContentは私が思うそれらの1つです: –

関連する問題