2013-03-04 6 views
18

से प्रतिक्रिया प्राप्त मैं कोडPostAsJsonAsync

var response = new HttpClient().PostAsJsonAsync(posturi, model).Result; 

नामक वेबएपीआई नियंत्रक बचा लिया गया था यकीन है कि वस्तु बनाने के लिए एक bool रिटर्न की इस पंक्ति है, लेकिन कैसे मुझे लगता है कि bool प्रतिक्रिया वापस करते हैं?

+0

प्रतिक्रिया ऑब्जेक्ट का पता लगाने के लिए डीबगर का उपयोग करें। फिडलर को यह भी देखने के लिए मिलता है कि क्या पोस्ट किया जा रहा है और प्राप्त किया गया है। अगर आप इसे Async तरीके से उपयोग करना चाहते हैं तो इसके अलावा प्रतीक्षा करें। – niico

उत्तर

43

सामग्री से प्राप्त करने के लिए जारी रखें:

var httpClient = new HttpClient(); 
var response = httpClient.PostAsJsonAsync(posturi, model).Result; 
bool returnValue = response.Content.ReadAsAsync<bool>().Result; 

लेकिन, यह वास्तव में त्वरित तरीका परिणाम प्राप्त करने के लिए अनुभवहीन दृष्टिकोण है। इसके अलावा, बजाय जांच करने के लिए एक वस्तु या सहेजा नहीं गया है कि क्या एक ध्वज का उपयोग कर के,

var httpClient = new HttpClient(); 
var response = await httpClient.PostAsJsonAsync(posturi, model); 
bool returnValue = await response.Content.ReadAsAsync<bool>(); 

आप: PostAsJsonAsync और ReadAsAsync इस तरह करने के लिए तैयार नहीं है, वे async await प्रोग्रामिंग का समर्थन करने के तैयार कर रहे हैं, तो आपके कोड होना चाहिए बचत को सफलतापूर्वक निर्धारित करने के लिए 200 OK लौटकर HTTP कोड का उपयोग करना चाहिए।

+0

ली, इस विशेष परिस्थिति के लिए एक बहुत विशिष्ट है कि मैं इस उदाहरण में क्यों नहीं हूं –

+2

क्यों 'प्रतीक्षा करें' और 'प्रतीक्षा' के बजाय अवरुद्ध क्यों? –

3

आप जेनेरिक वर्जन को कॉल करते हैं, तो यह आपको वापस bool देना चाहिए:

var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result; 

कम से कम the docs के अनुसार।

+1

मुझे लगता है कि अनुरोध को प्रभावित करता है, प्रतिक्रिया नहीं। – Timmerz

10

के बाद से अपने एक Async आपरेशन तुरंत रूप .Result नहीं करते इसका गलत

इसके बजाय आप ऐसा करके async यह सब करने की ज़रूरत:

वर httpclient = नई HttpClient()

var task = httpClient.PostAsJsonAsync(posturi, model) 
         .ContinueWith(x => x.Result.Content.ReadAsAsync<bool>().Result); 

    // 1. GETTING RESPONSE - NOT ASYNC WAY 
    task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE! 
    bool response = task.Result 

    // 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5 
    task.ContinueWith(x => { 
           bool response = x.Result 
          }); 

    // 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5 
    bool response = await task; 

नोट: मैंने उन्हें यहां लिखा है, इसलिए मैंने वास्तव में उनका परीक्षण नहीं किया था, लेकिन आप जो चाहते हैं उतना ही कम।

मुझे आशा है कि इससे मदद मिलती है!

+1

मैं httpClient को एक प्रयोग कथन में लपेटने की अनुशंसा नहीं करता - https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Xander

3

मैंने परिणाम देखने के लिए HttpStatusCode का उपयोग किया।

public HttpStatusCode PostStaffPositions(Foo foo) 
    { 
     string uri = myapiuri; 

     using (HttpClient httpClient = new HttpClient()) 
     { 
      var response = httpClient.PostAsJsonAsync(uri, foo).Result; 
      return response.StatusCode; 
     } 
    } 

और फिर नियंत्रक में इस तरह की जाँच करें:

HttpStatusCode update = staffrest.PostStaffPositions(foo); 
      if (update == HttpStatusCode.OK) 
      { 
       //Update Succeed 
      } 
      else 
      { 
       //Update Failed 
      } 
28

स्वीकार किए जाते हैं जवाब तकनीकी रूप से सही है, लेकिन ब्लॉक .Result के लिए कॉल पर वर्तमान धागा। यदि आप .NET 4.5 या उच्चतर का उपयोग कर रहे हैं, तो आपको लगभग सभी स्थितियों में इससे बचना चाहिए। इसके बजाय, बराबर अतुल्यकालिक (गैर अवरुद्ध) संस्करण का उपयोग करें:

var httpClient = new HttpClient(); 
var response = await httpClient.PostAsJsonAsync(posturi, model); 
bool returnValue = await response.Content.ReadAsAsync<bool>(); 

ध्यान दें कि विधि ऊपर कोड युक्त async चिह्नित होना ज़रूरी है, और खुद को await एड होना चाहिए।