2012-10-23 7 views
18

Sto facendo un progetto Asp.Net MVC 4 e sto cercando una richiesta interna (come un proxy) al nostro servizio API.Creazione di una richiesta post HttpClient asincrona con dati da FormCollection

Ecco come appare il metodo dell'indice nel mio controller. Sono bloccato alla parte 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 
    }); 
} 

voglio passare i miei contenuti "/ x-form-urlencoded applicazione" "corpo" al metodo PostAsync POST. Tuttavia, viene visualizzato un messaggio di errore "il corpo non è di tipo HttpContent".

Non riesco a trasmettere o convertire. E adesso?

Fammi sapere cosa sto facendo in modo errato qui.

Erik

+0

'' FormCollection' e HttpContent' sono completamente diversi tipi. Perché dovresti aspettarti che il tuo codice funzioni (con o senza un cast)? Quello che devi fare è creare un nuovo 'HttpContent', basato sui dati nel tuo' FormCollection'. – svick

+0

Giusto, sto cercando di illustrare ciò che ho bisogno di fare sopra. Sto cercando più di un passaggio attraverso una semplice risposta. @svick, hai un esempio di creazione di un nuovo HttpContent basato su un insieme di dati FormCollection? – Erik5388

risposta

33

Io non sono del tutto sicuro di quello che stai cercando di fare, ma forse la conversione del FormCollection a un dizionario e utilizzando la classe FormUrlEncodedContent è quello che stai cercando.

es .:

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

Per tutto questo tempo, stavo cercando di farlo usando MultipartFormDataContent e fallendo. Semplicemente usando FormUrlEncodedContent con la mia richiesta funziona come un incantesimo. Grazie! – killthrush

+0

non è meglio convertire i dati in HttpContent? o HttpContent è solo un altro dizionario? – Erik5388

+1

@ Erik5388 Penso che HttpContent sia una * base class astratta *. Non puoi istanziarlo. Invece, hai bisogno di una classe concreta ... che la erediti .. e 'FormUrlEncodedContent' penso che sia una di quelle :) –