2012-10-23 6 views
18

Wykonuję projekt Asp.Net MVC 4 i szukam wewnętrznego żądania (takiego jak proxy) do naszej usługi APi.Tworzenie żądania asynchronicznego HttpClient z danymi z FormCollection

Tak właśnie wygląda metoda indeksu w moim kontrolerze. Utknąłem w części 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 
    }); 
} 

Chcę przekazać moje "application/x-form-urlencoded" "ciało" treści do sposobu PostAsync POST. Jednak otrzymuję komunikat o błędzie "treść nie jest typu HttpContent".

Nie mogę przesłać ani przekonwertować. Co teraz?

Daj mi znać, co tu robię nieprawidłowo.

Erik

+0

'FormCollection' i 'HttpContent' są całkowicie różne typy. Dlaczego miałbyś oczekiwać, że twój kod będzie działał (z lub bez obsady)? Trzeba tylko utworzyć nową "HttpContent", opartą na danych w 'FormCollection'. – svick

+0

Dobra, próbuję zilustrować to, czego potrzebuję powyżej. Szukam więcej przejścia niż prostej odpowiedzi. @ Sick, czy masz przykłady tworzenia nowej HttpContent na podstawie zestawu danych FormCollection? – Erik5388

Odpowiedz

33

Nie jestem do końca pewien, co próbujesz zrobić, ale być może przekształcając FormCollection do słownika i przy użyciu klasy FormUrlEncodedContent jest to, czego szukasz.

np .:

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

Cały ten czas próbowałem zrobić to za pomocą MultipartFormDataContent i nie udało się. Po prostu użycie FormUrlEncodedContent z moją prośbą działa jak urok. Dzięki! – killthrush

+0

czy nie jest lepiej konwertować dane do HttpContent? lub czy HttpContent jest tylko innym słownikiem? – Erik5388

+1

@ Erik5388 Myślę, że HttpContent jest * abstrakcyjną klasą podstawową *. Nie możesz tego utworzyć. Zamiast tego, potrzebujesz konkretnej klasy .., która dziedziczy to ... i 'FormUrlEncodedContent', myślę, że jest jedną z nich :) –

Powiązane problemy