2016-05-11 30 views
7

मैंने बटन पर एएसपी.नेट पेज से वेब एपीआई को नीचे क्लिक किया है। यह बिल्कुल ठीक काम कर रहा है के रूप में यह async नहीं है, हालांकि मैंने कहीं पढ़ा है कि यह गतिरोध पैदा करेगा (वजह से लाइन client.PostAsJsonAsync(url, sd).Result; में .Result के उपयोग करने के लिए)एप्लिकेशन से कॉल वेब एपीआई

इस कोड को अद्यतन करने के लिए सबसे अच्छा तरीका है के लिए सुझाव दें।

private void CallApi(SurveyData sd) 
{ 

    using (var client = new HttpClient()) 
    {     

     string url = ConfigurationManager.AppSettings.Get("url"); 
     client.DefaultRequestHeaders.Accept.Clear(); 

     var response = client.PostAsJsonAsync(url, sd).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      Response.Write("Success"); 
     } 
     else 
     { 
      Response.Write(response.StatusCode + " : Message - " + response.ReasonPhrase); 
     } 
    } 
} 
+0

में विन्यस्त साथ एपीआई तरीकों को संभालने के लिए के रूप में लिखना शुरू किया है के साथ की कोशिश कर सकते हां, रेखा, var प्रतिक्रिया = client.PostAsJsonAsync (url, sd)। Reses; प्रतिक्रिया के लिए इंतजार करना है। आप अपने वेबपी में एसिंक नियंत्रक विकल्प का उपयोग कर सकते हैं। – Saadi

+0

मुझे यकीन नहीं है, लेकिन क्या होगा यदि आप 'CallApi' विधि' async' बनाते हैं और उस विधि का उपयोग करते समय 'await' का उपयोग करते हैं? – Raghuveer

+2

यदि यह एमवीसी नहीं है, तो विधि को एसिंक बनाया जा सकता है और फिर क्लाइंट। पोस्टएएसजेसनएसिंक का इंतजार किया जा सकता है। हालांकि यह आम तौर पर (जैसा कि मैं इसे समझता हूं, वैसे ही विधियों को एसिंक के रूप में चिह्नित करने के लिए खराब अभ्यास)। – Tim

उत्तर

1

यदि आप async का उपयोग नहीं करना चाहते हैं तो आप HttpClient के बजाय WebClient का उपयोग कर सकते हैं।

WebClient client = new WebClient(); 
string response = client.UploadString(RequestUrl, "POST", data); 
0

आप एक async पद्धति के रूप में विधि (इस स्थिति में मैं string की वापसी प्रकार प्रदान सुझाव देंगे) पुनर्लेखन सकता है:

private async Task<string> CallApi(SurveyData sd) 
{ 

    string result = String.Empty; 

    using (var client = new HttpClient()) 
    { 

     string url = ConfigurationManager.AppSettings["url"]; 
     client.DefaultRequestHeaders.Accept.Clear(); 

     var response = await client.PostAsJsonAsync(url, sd); 

     if (response.IsSuccessStatusCode) 
     { 
      result = "Success"; 
     } 
     else 
     { 
      result = response.StatusCode + " : Message - " + response.ReasonPhrase; 
     } 
    } 

    return result; 
} 

तो फिर तुम कर सकते थे भी await इस कॉल के परिणाम:

Response.Write(await CallApi(sd)); 

हालांकि कॉल की आवश्यकता होगी एक और async विधि के भीतर से किए जाने के लिए। अन्यथा आपको Response.Write(CallApi(sd).Result); करना होगा, और मुझे नहीं पता कि क्या आप प्रदर्शन में महत्वपूर्ण सुधार देखेंगे।

+0

एक 'async' विधि' स्ट्रिंग 'वापस नहीं कर सकता है, इसे इसके बजाय' कार्य 'वापस करना होगा। कृपया अपने उत्तर में वापसी प्रकार को ठीक करें। –

+0

@ फेडरिको डिप्मा - सही। पकड़ के लिए धन्यवाद :) – Tim

0

आप इस पद्धति

public async Task<HttpResponseMessage> GetHttpClientResult<T>(string baseUrl, string url, T requestParam, bool isExternalLink = false, 
      string acceptMediaVerb = "application/json", HttpMethod requestMethod = null) 
     { 
      try 
      { 
       HttpClient client = new HttpClient(); 
       HttpResponseMessage response = new HttpResponseMessage(); 
       if (!isExternalLink) 
       { 
        client.BaseAddress = new Uri(baseUrl); 
       } 
       if (!string.IsNullOrEmpty(acceptMediaVerb)) 
       { 
        if (acceptMediaVerb == "application/json") 
        { 
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
         if (requestMethod == HttpMethod.Get || requestMethod == null) 
         { 
          response = client.GetAsync(url).Result; 
         } 
         else if (requestMethod == HttpMethod.Post) 
         { 
          response = await client.PostAsJsonAsync(url, requestParam); 
         } 
        } 
       } 
       var context = new HttpContextWrapper(HttpContext.Current); 
       HttpRequestBase request = context.Request; 
       return response; 
      } 
      catch 
      { 
       return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest); 
      } 
     } 

यह एक सामान्य विधि एक आधार यूआरएल आपके आवेदन ही या किसी बाहरी वेब अनुरोध

संबंधित मुद्दे