2014-10-13 7 views
7

यह त्रुटि मैं मिलता है:एक या अधिक त्रुटियां उत्पन्न हुई: PostAsJsonAsync

One or more errors occurred. 
    at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 
    at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification) 
    at System.Threading.Tasks.Task`1.get_Result() 
    at myProject.mymethod(Int32[] myIds) in path\MyClass.cs:line 758 

यहाँ और वह विधि है:

private void mymethod(int[] myIds) 
{ 
    var uri = new Uri(string.Format(UriPath, string.Format(MyPath))); 
    var client = GetHttpClient(uri); 

    var postModel = new PostModel 
    { 
     Ids = myIds, 
     LastUpdate = NewItem ? null : _lastUpdated 
    }; 

    if (client != null) 
    { 
     var response = client.PostAsJsonAsync(uri, postModel).Result;//this line crashes 

     if (response.IsSuccessStatusCode) 
     { 
      //doSomething 
     } 
    } 
} 

मैं इस और उन सभी को छोड़कर काम की तरह तरीकों का एक बहुत फोन यह वाला। जब यह मारा जाता है, इसमें बहुत समय लगता है और फिर यह अपवाद फेंकता है। अन्य सभी तरीकों से त्रुटि नहीं होती है।

private HttpClient GetHttpClient(Uri uri) 
{ 
    var handler = new HttpClientHandler 
    { 
     CookieContainer = CoockieContainer 
    }; 

    return new HttpClient(handler) 
    { 
     BaseAddress = uri 
    }; 
} 

यहाँ एपीआई विधि है:

[HttpPost] 
    public IList<MyModel> MyAPIMethod(PostModel model) 
    { 
     List<MyModel> myTranslations; 
     using (var db = new myEntities(GetDbConnStrByUser(new GetCookies().GetUserName()))) 
     { 
      myTranslations = db.tblTranslations.Where(it => model.Ids.Contains(it.id) 
            && (!model.Update.HasValue || it.update > model.LastUpdate.Value)) 
            .Select(it => new MyModel 
            { 
             Id = it.id, 
             Name = it.name, 
             Description = it.desc, 
             LanguageId = it.language_id            
            }).ToList(); 
     } 

     return myTranslations.GroupBy(x => new { x.Id, x.LanguageId }).Select(x => x.First()).ToList(); 
    } 

हो सकता है कि समय समाप्त होता है

Inner.System.Threading.Tasks.TaskCanceledException: A task was canceled. 

यहाँ मेरी GetCLient() विधि है:

यह आंतरिक अपवाद नहीं है।

फिडलर इस त्रुटि को लौटाता है: प्रतीक्षा ऑपरेशन का समय समाप्त हो गया।

+0

बयान अवरुद्ध का उपयोग न करें, async साथ बजाय जाओ। आंतरिक अपवाद को देखो। –

+0

@JeroenVannevel बयान अवरुद्ध करके आपका क्या मतलब है? –

+0

'रेसल्ट' को कॉल एक तुल्यकालिक बयान है; आप कभी भी एसिंक्रोनिटी का उपयोग नहीं कर रहे हैं जो आपके पास हो सकता है। उचित async-await उपयोग पर अधिक यहां: http://msdn.microsoft.com/en-us/library/hh191443.aspx –

उत्तर

-1
var client = new HttpClient(); 
var response = await client.PostAsJsonAsync(posturi, postModel); 
bool returnValue = await response.Content.ReadAsAsync<bool>(); 
if (response.IsSuccessStatusCode) { 
    //doSomething 
} 
+0

यह कोड एसिंक का उपयोग करने के लिए लिखता है, लेकिन यह समस्या को कैसे ठीक करता है? क्या कोई कारण बुला रहा है। सीधे सीधे काम नहीं करेगा? –

9

.Result टी यह तुल्यकालिक को पूरा करने के कार्य के लिए इंतजार कर रहे ब्लॉक में कार्य चालू करने के लिए कोशिश करता है और केवल टी वापस आ जाएगी अगर कोई अपवाद नहीं होते हैं। आपको दो प्रकार के अपवादों की अपेक्षा करनी चाहिए, ऑपरेशन कैंक्लेड एक्सेप्शन/टास्क कैंक्लेड एक्सेप्शन (जब HTTP अनुरोध का समय समाप्त हो जाता है या रद्दीकरण टोकन का उपयोग किया जाता था और टोकन रद्द कर दिया गया था - मुझे नहीं लगता कि बाद वाला यहां लागू है) और सामान्य/HTTP- संबंधी अपवाद।

आप शायद HTTP टाइमआउट परिदृश्य में चल रहे हैं। क्या अपवाद को फेंकने में काफी समय लग रहा है? यदि नहीं, तो आपकी GetHttpClient विधि कैसी दिखती है? क्या यह स्पष्ट रूप से टाइमआउट या रद्दीकरण टोकन सेट कर रहा है?

आप तुल्यकालिक दृष्टिकोण के साथ रहना चाहते हैं और नहीं देता कार्य, तो आप इस बजाय की तरह कुछ करना चाहिए:

try 
{  
    var response = client.PostAsJsonAsync(uri, postModel).Result;//this line crashes 
} 
catch (OperationCanceledException oce) 
{ 
    // Tell the user that the request timed our or you cancelled a CancellationToken 
} 
catch (Exception exc) 
{ 
    // Look at the HttpClient docs and try to catch something more specific. You don't want 
    // to swallow StackOverflowExceptions or OutOfMemoryExceptions. 
} 

आप async डुबकी लेने के लिए तैयार हैं, तो यह अधिक है कि तुम क्या ' तलाश है:

private async Task mymethodAsync(int[] myIds) 
{ 
    var uri = new Uri(string.Format(UriPath, string.Format(MyPath))); 
    var client = GetHttpClient(uri); 

    var postModel = new PostModel { ... }; 

    if (client != null) 
    { 
     try 
     { 
      var response = await client.PostAsJsonAsync(uri, postModel); 

      if (response.IsSuccessStatusCode) 
      { 
       //doSomething 
      } 
     } 
     catch (OperationCanceledException oce) 
     { 
      // because timeouts are still possible 
     } 
     catch (Exception exc) { 
      // Because other things can still go wrong too (HTTP 500, parsing errors) 
     } 
    } 
} 

अधिक जानकारी के लिए यहाँ देखें कैसे .Result कॉल w/HttpClient काम करता है पर: What happens while waiting on a Task's Result?

+0

आंतरिक अपवाद TaskCanceledExceptions है। आपका पहला समाधान वास्तव में कुछ भी हल नहीं करता है, यह केवल कोशिश-पकड़ ब्लॉक जोड़ता है। –

+0

हां, अपवाद को फेंकने में काफी समय लग रहा है। –

+0

फिडलर इस त्रुटि को लौटाता है: प्रतीक्षा ऑपरेशन का समय समाप्त हो गया। –

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