2014-10-16 4 views
5

पास करता है मैं POST को controller से दूसरे controller पर करने का प्रयास कर रहा हूं। controller दोनों अलग-अलग परियोजनाओं से हैं। एक प्रोजेक्ट प्रेजेंटेशन लेयर अनुकरण करने के लिए काम कर रहा है (जिसे मैं यहां टेस्ट प्रोजेक्ट कहूंगा)।HttpClient एकाधिक सरल पैरामीटर

परीक्षण प्रोजेक्ट से मैं अन्य नियंत्रक को 2 सरल string पैरामीटर पास करने की कोशिश कर रहा हूं जिसे मैं प्रक्रिया कहूंगा।

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"); 
} 

और प्रक्रिया नियंत्रक में, मैं इस तरह इसे प्राप्त करने के कोशिश कर रहा हूँ:

लेकिन यह इस controller कभी नहीं पहुंचता है। मुझे हमेशा "स्थिति नहीं मिला" मिलता है।

तो मैं HttpClient() के साथ 2 सरल पैरामीटर कैसे पास कर सकता हूं?

+0

तुम क्यों GetAsync का उपयोग नहीं करते? मतलब आपको पोस्ट से प्राप्त करने के लिए Verb बदल रहा है। – NMK

+0

क्योंकि मैं केवल 'जीईटी' के साथ 1 पैरामीटर पास कर सकता हूं। हालांकि मैंने आपके समाधान की कोशिश की, लेकिन काम नहीं किया। यह प्रक्रिया में नहीं आ रहा है 'नियंत्रक' – Quoter

उत्तर

7

सरल प्रकार पैरामीटर के लिए पोस्ट के बजाय प्राप्त करें का उपयोग करें।

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"); 

    } 

एपीआई पक्ष में आप ऐसा कर सकते हैं।

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

क्या मुझे विशेषता में मार्ग के साथ कुछ करने की आवश्यकता है? इस पोस्ट में वे क्या वर्णन करते हैं: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Quoter

+0

हाँ आप विशेषता का उपयोग करते हैं रूटिंग या आप फिट करने के लिए अपनी रूटिंग कॉन्फ़िगरेशन अपडेट कर सकते हैं। – NMK

+0

या आप उत्पाद/आईडी = मान और प्रकार = मान – NMK

0

मुझे यकीन नहीं है कि मैं इसके साथ पूरी तरह से प्यार करता हूं, लेकिन मैंने अतीत में इसे संभालने के लिए अनाम प्रकार और गतिशीलता का उपयोग किया ... (PostAsJsonAsync() का उपयोग करने के लिए कॉन्फ़िगर अंतर को नोट करें। मैं इन्हें प्रारंभ में भूल गया था।)

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

प्राप्त नियंत्रक:

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

WebApiConfig.Register में():

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

अन्य दृष्टिकोण, जिसे मैंने पारित किया है, इन कॉलों में से प्रत्येक के लिए दृढ़ता से प्रकार के मॉडल का एक बिल्कुल नया सेट बनाना है। मैं नहीं चाहता था, क्योंकि मेरे पास वेबपैआई बनाने के लिए उनमें से एक टन था।

+0

आपके समाधान का भी प्रयास किया, लेकिन काम नहीं किया। यह प्रक्रिया 'नियंत्रक' में ब्रेकपॉइंट को कभी भी मार नहीं रहा है। – Quoter

+0

क्या आप दोनों अनुप्रयोगों को डीबग कर रहे हैं? – SethMW

+0

हां।प्रक्रिया 'नियंत्रक' के अंदर ब्रेकपॉइंट के साथ हर दूसरी विधि हिट हो जाती है। बस यह नहीं करता है। फिडलर लाल रंग में यूआरएल को भी चिह्नित कर रहा है। लेकिन जब इसका निरीक्षण करते हैं, तो यह कुछ भी नहीं दिखाता है जो मुझे बताता है कि समस्या क्या हो सकती है। – Quoter

0

जब एक पोस्ट प्राप्त आप मानकों में [FromBody] के लिए विधि

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

यह काम नहीं करेगा ... आपके पास एक से अधिक [FromBody] विशेषता नहीं हो सकती https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter -binding-इन-aspnet-वेब-api – Bartosz

0

यहाँ के नाम से जाना एक और उदाहरण आप WinForms, WPF या Console क्षुधा के लिए उपयोग कर सकते हैं है का उल्लेख करना होगा

ग्राहक कोड

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; 
     } 

नियंत्रक सर्वर-साइड कोड

[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; 
      } 
     } 
संबंधित मुद्दे