2014-10-16 16 views
5

Tôi đang cố gắng thực hiện POST từ một số controller sang một số khác controller. Cả hai controller là từ các dự án khác nhau. Một dự án đang phục vụ để mô phỏng lớp trình bày (mà tôi sẽ gọi cho dự án thử nghiệm ở đây).HttpClient chuyển nhiều thông số đơn giản

Từ dự án thử nghiệm Tôi đang cố gắng chuyển 2 tham số đơn giản string cho bộ điều khiển khác mà tôi sẽ gọi quy trình.

var values = new List<KeyValuePair<string, string>>(); 
values.Add(new KeyValuePair<string, string>("id", param.Id.Value)); 
values.Add(new KeyValuePair<string, string>("type", param.Type.Value)); 
var content = new FormUrlEncodedContent(values); 
using (var client = new HttpClient()) 
{ 
     client.BaseAddress = new Uri(url); 
     client.DefaultRequestHeaders.Clear(); 
     client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("nl-NL")); 

     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     string token = param.token.Value; 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

     var response = client.PostAsync("/api/Process/Product", content).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var result = response.Content.ReadAsStringAsync().Result; 
      return Request.CreateResponse(HttpStatusCode.OK, result); 
     } 

     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "fail"); 
} 

Và trong điều khiển quá trình, tôi đang cố gắng để đón nhận nó như thế này:

Nhưng nó không bao giờ đạt controller này. Tôi luôn nhận được "mã trạng thái không tìm thấy".

Vậy làm cách nào tôi có thể chuyển 2 tham số đơn giản với HttpClient()?

+0

Tại sao bạn không sử dụng GetAsync? Có nghĩa là bạn thay đổi động từ từ bài đăng thành Nhận. – NMK

+0

Vì tôi chỉ có thể chuyển 1 tham số bằng 'GET'. Mặc dù tôi đã thử giải pháp của bạn nhưng không hoạt động. Nó không đến trong quá trình 'controller' – Quoter

Trả lời

7

Sử dụng Nhận thay vì Đăng cho các thông số loại đơn giản.

using (var client = new HttpClient()) 
    { 
     BaseAddress = new Uri(url); 
     client.BaseAddress = new Uri(url); 
    client.DefaultRequestHeaders.Clear(); 
    client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("nl-NL")); 

    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

    string token = param.token.Value; 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

     // New code: 
     var response = await client.GetAsync(string.format("api/products/id={0}&type={1}",param.Id.Value,param.Id.Type)); 
if (response.IsSuccessStatusCode) 
    { 
     var result = response.Content.ReadAsStringAsync().Result; 
     return Request.CreateResponse(HttpStatusCode.OK, result); 
    } 

    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "fail"); 

    } 

Ở phía API, bạn có thể làm như thế này.

[HttpGet] 
public HttpResponseMessage Product(string id, string type) 
{ 
    return null; 
} 
+0

Tôi có cần làm gì đó với tuyến đường trong thuộc tính không? Giống như những gì họ mô tả trong bài đăng này: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Quoter

+0

Có bạn sử dụng thuộc tính định tuyến hoặc bạn có thể cập nhật cấu hình định tuyến của mình để phù hợp với điều này. – NMK

+0

Hoặc bạn có thể thử như sản phẩm/id = value & type = value – NMK

0

Tôi không chắc mình hoàn toàn thích nó, nhưng tôi đã sử dụng các kiểu ẩn danh và động lực để xử lý điều này trong quá khứ ... (Lưu ý sự khác biệt về cấu hình để sử dụng PostAsJsonAsync().

client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));  
client.PostAsJsonAsync("api/User/UpdateLastLogin", new { UserId = userId, ApplicationId = applicationId }); 

Tiếp nhận điều khiển:

[HttpPost] 
    public void UpdateLastLogin([FromBody]dynamic model) 
    { 
     _userRepository.UpdateLastLogin((int)model.UserId, (int)model.ApplicationId); 
    } 

Trong WebApiConfig.Register():

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; 
config.Formatters.Remove(config.Formatters.XmlFormatter); 

Cách tiếp cận khác, mà tôi đã tiếp tục, là tạo ra một bộ hoàn toàn mới các kiểu mô hình mạnh mẽ cho mỗi một trong các cuộc gọi này. Tôi không muốn, như tôi đã có một tấn của họ để làm cho một WebAPI.

+0

Thử nghiệm giải pháp của bạn, nhưng cũng không hoạt động. Nó không bao giờ nhấn breakpoint trong quá trình 'controller'. – Quoter

+0

Bạn có đang gỡ lỗi cả hai ứng dụng không? – SethMW

+0

Có.Mỗi phương thức khác với một điểm ngắt bên trong quá trình 'controller' bị tấn công. Chỉ cái này thôi. Fiddler cũng đang đánh dấu url bằng màu đỏ. Nhưng khi kiểm tra nó, nó không hiển thị bất cứ điều gì cho tôi biết vấn đề có thể là gì. – Quoter

0

Khi nhận được một bài bạn phải xác định [FromBody] trong các tham số cho phương pháp này được gọi là

[HttpPost] 
public HttpResponseMessage Product([FromBody]string id, [FromBody]string type) 
{ 
    return null; 
} 
+0

Điều này sẽ không hoạt động ... Bạn không thể có nhiều hơn một thuộc tính [FromBody] https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter -binding-in-aspnet-web-api – Bartosz

0

Dưới đây là một ví dụ khác, bạn có thể sử dụng cho WinForms, WPF hoặc Console ứng dụng

Mã khách hàng

async Task<CalendarView> GetData(int month, int year, int deviceTypeID) 
     { 
      var result = new MSOCommon.CalendarView(); 
      try 
      { 
       HttpClient client = new HttpClient(); 

       var calendarRequest = new CalendarRequest() 
       { 
        Month = month, 
        Year = year, 
        DeviceTypeID = deviceTypeID, 
        UserInfo = Program.UserInfo 
       }; 

       var url = Properties.Settings.Default.ServerBaseUrl + string.Format("/api/calendar/Calendar"); 

       HttpResponseMessage response = await client.PostAsync(url, calendarRequest.AsJson()); 
       if (response.IsSuccessStatusCode) // Check the response StatusCode 
       { 
        var serSettings = new JsonSerializerSettings() 
        { 
         TypeNameHandling = TypeNameHandling.All 
        };  

        string responseBody = await response.Content.ReadAsStringAsync(); 

        result = JsonConvert.DeserializeObject<MSOCommon.CalendarView>(responseBody, serSettings); 
       } 
       else 
       { 
        logger.Error(Properties.Resources.DATACannotGetCalendar); 
       } 
      } 
      catch (Exception ex) 
      { 
       logger.Error(Properties.Resources.DATACannotGetCalendar + " " + ex.Message); 
       logger.Error(ex); 
      } 

      return result; 
     } 

điều khiển server-side code

[HttpPost()] 
     public CalendarView Calendar(CalendarRequest calendarRequest) 
     { 
      logger.Info(string.Format("Get calendar for month {0} and year {1} ", calendarRequest.Month, calendarRequest.Year)); 
      // TODO Check username 
      var result = new CalendarView(); 

      using (var db = new MSOnlineEntities()) 
      { 
       result = db.Calendars.Include("CalendarDetails") 
        .Where(x => x.CMonth == calendarRequest.Month && x.CYear == calendarRequest.Year && x.CDeviceTypeID == calendarRequest.DeviceTypeID).ToList() 
        .ConvertAll(x => new CalendarView 
        { 
         ID = x.ID, 
         CMonth = x.CMonth, 
         CYear = x.CYear, 
         CDays = x.CDays, 
         CDeviceTypeID = x.CDeviceTypeID, 
         ClosedAtTime = x.ClosedAtTime, 
         ClosedByUser = x.ClosedByUser, 
         IsClosed = x.IsClosed, 
         CalendarDetails = x.CalendarDetails.ToList().ConvertAll(d => new CalendarDetailView 
         { 
          ID = d.ID, 
          CalendarID = d.CalendarID, 
          MachineID = d.MachineID, 
          MachineName = d.DATA_MACHINE.Name, 
          D1 = d.D1 ?? -1, 
          D2 = d.D2 ?? -1, 
          D3 = d.D3 ?? -1, 
          D4 = d.D4 ?? -1, 
          D5 = d.D5 ?? -1, 
          D6 = d.D6 ?? -1, 
          D7 = d.D7 ?? -1, 
          D8 = d.D8 ?? -1, 
          D9 = d.D9 ?? -1, 
          D10 = d.D10 ?? -1, 
          D11 = d.D11 ?? -1, 
          D12 = d.D12 ?? -1, 
          D13 = d.D13 ?? -1, 
          D14 = d.D14 ?? -1, 
          D15 = d.D15 ?? -1, 
          D16 = d.D16 ?? -1, 
          D17 = d.D17 ?? -1, 
          D18 = d.D18 ?? -1, 
          D19 = d.D19 ?? -1, 
          D20 = d.D20 ?? -1, 
          D21 = d.D21 ?? -1, 
          D22 = d.D22 ?? -1, 
          D23 = d.D23 ?? -1, 
          D24 = d.D24 ?? -1, 
          D25 = d.D25 ?? -1, 
          D26 = d.D26 ?? -1, 
          D27 = d.D27 ?? -1, 
          D28 = d.D28 ?? -1, 
          D29 = d.D29 ?? -1, 
          D30 = d.D30 ?? -1, 
          D31 = d.D31 ?? -1 
         }) 
        }).FirstOrDefault(); 

       return result; 
      } 
     } 
Các vấn đề liên quan