2012-10-23 8 views
18

Tôi đang thực hiện dự án Asp.Net MVC 4 và đang tìm kiếm yêu cầu nội bộ (như proxy) cho dịch vụ api của chúng tôi.Thực hiện yêu cầu đăng bài HttpClient không đồng bộ với dữ liệu từ FormCollection

Đây là phương pháp chỉ mục giống như trong trình điều khiển của tôi. Tôi bị kẹt ở phần 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 
    }); 
} 

Tôi muốn chuyển nội dung "application/x-form-urlencoded" "body của mình vào phương thức POST PostAsync. Tuy nhiên, tôi nhận được một lỗi đọc "cơ thể không phải là loại HttpContent".

Tôi không thể truyền hoặc chuyển đổi. Gì bây giờ?

Hãy cho tôi biết những gì tôi đang làm không chính xác ở đây.

Erik

+0

'FormCollection' và' HttpContent' là loại hoàn toàn khác nhau. Tại sao bạn mong đợi rằng mã của bạn sẽ làm việc (có hoặc không có một diễn viên)? Những gì bạn cần làm là tạo một 'HttpContent' mới, dựa trên dữ liệu trong' FormCollection' của bạn. – svick

+0

Đúng, tôi đang cố minh họa những gì tôi cần làm ở trên. Tôi đang tìm kiếm nhiều bước đi hơn là một câu trả lời đơn giản. @svick, bạn có ví dụ về việc tạo một HttpContent mới dựa trên một bộ dữ liệu FormCollection không? – Erik5388

Trả lời

33

Tôi không hoàn toàn chắc chắn những gì bạn đang cố gắng để làm, nhưng có thể chuyển đổi các FormCollection để một cuốn từ điển và sử dụng lớp FormUrlEncodedContent là những gì bạn đang tìm kiếm.

ví dụ .:

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

Tất cả thời gian này, tôi đã cố gắng để làm điều này bằng cách sử dụng MultipartFormDataContent và thất bại. Đơn giản chỉ cần sử dụng FormUrlEncodedContent với yêu cầu của tôi hoạt động như một sự quyến rũ. Cảm ơn! – killthrush

+0

là không tốt hơn để chuyển đổi dữ liệu sang HttpContent? hoặc là HttpContent chỉ là một từ điển khác? – Erik5388

+1

@ Erik5388 Tôi nghĩ HttpContent là một * lớp cơ sở trừu tượng *. Bạn không thể khởi tạo điều đó. Thay vào đó, u cần một lớp cụ thể .. mà thừa hưởng rằng .. và 'FormUrlEncodedContent' tôi nghĩ là một trong số đó :) –