2013-05-16 16 views
5

पर काम नहीं कर रहा है मेरे पास एक नियंत्रक पर धीमी गति से चल रही कार्रवाई है जिसे मैंने नई Async विधि में परिवर्तित कर दिया है। अब यह बहुत तेजी सेएमवीसी 4.5 Async Ajax कॉल

System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] 
बजाय पूरा करने के लिए async के लिए इंतजार की

चलाता है, लेकिन किसी भी jQuery अजाक्स कॉल करने के लिए इसे निम्नलिखित स्ट्रिंग लौटाने,।

मैं यहाँ क्या गलत कर रहा हूं? मैंने पाया कि हर उदाहरण का पालन किया है और यह लागू करने के लिए रॉकेट विज्ञान नहीं है।

सुंदर बहुत पीछा किया क्या इस वीडियो

http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287

और यह लिंक बहुत

http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4#CreatingAsynchGizmos

मैं समझता हूँ कि Async HTTP परिवर्तन नहीं करता है में उल्लिखित है, लेकिन मैं क्या था उम्मीद है कि पृष्ठभूमि में काम करने के लिए अजाक्स कॉल लंबे समय तक चलने के लिए था, और उसके बाद परिणाम समाप्त होने पर परिणाम पर वापस आ गया। इसके बाद सर्वर को अवरुद्ध करने के बजाय अतिरिक्त AJAX कॉल को संसाधित करने के लिए सर्वर को मुक्त कर दिया जाएगा।

अद्यतन:

यहाँ यहाँ जावास्क्रिप्ट कोड

function doWork(options){ 
    return $.ajax("/getData", { 
        contentType: 'text/json', 
        async: true, 
        success: $.proxy(options.callback, options.scope), 
        error: function (jqXHR, textStatus, error) { 
         options.callback.apply(options.scope, [error, textStatus, jqXHR]); 
        } 
       }); 
} 

है और सी # में मेरी नियंत्रक कार्रवाई

[HttpGet] 
[AsyncTimeout(60000)] 
public async Task<ActionResult> GetData() 
     { 
      RestResponse<Data> response = new RestResponse<Data>(); 

      try 
      { 
       Data result = null; 

       await Task.Factory.StartNew(() => 
       { 
        result = ServerImpl.RetrieveData(); 
       }); 

       response.Value = result; 
       response.HttpStatusCode = 200; 
      } 
      catch (Exception ex) 
      { 
       response.HttpStatusCode = 500; 
       response.Value = null; 
      } 

      return Json(response, JsonRequestBehavior.AllowGet); 
     } 
+0

क्या आप अपने नियंत्रक कार्रवाई में एएसपी.NET सत्र का उपयोग कर रहे हैं? –

+0

@ डारिन हां हम हैं। – Matt

+2

फिर यह आपकी समस्या है। एएसपी.नेट सत्र आपको उसी सत्र से समानांतर अनुरोध करने की अनुमति नहीं देता है। चूंकि एएसपी.नेट सत्र थ्रेड सुरक्षित नहीं है, इसलिए एएसपी.नेट बस उसी सत्र से सर्वर तक समवर्ती पहुंच को अवरुद्ध कर देगा और उन्हें अनुक्रमिक रूप से प्रतीक्षा और निष्पादित करेगा। एएसपी.नेट सत्र आपके आवेदन में राज्य और कई अन्य समस्याओं का परिचय देता है और यह एक डिजाइन गंध है। यदि आप स्केलेबल और स्टेटलेस एप्लिकेशन चाहते हैं तो आपको इससे पहले कि आप इससे पहले छुटकारा पा सकें। –

उत्तर

12

समस्या यह है कि अपने सर्वर साइड कार्रवाई ASP.NET सत्र का उपयोग करता है जिसे धागा-सुरक्षित नहीं माना जाता है। नतीजतन, एएसपी.नेट उसी सत्र से समानांतर अनुरोध करता है और क्रमशः उन्हें निष्पादित करता है। सत्र पर भरोसा रखने वाला एक विश्वसनीय एपीआई एक बहुत ही खराब डिजाइन है और आईएमएचओ को फिर से निर्धारित किया जाना चाहिए ताकि यह राज्य पर भरोसा न करे।

+0

मुझे लगता है कि एक ही समस्या है। लेकिन मुझे समझ में नहीं आता कि सत्र को कैसे अक्षम किया जाए। मैं web.config में पहले ही अक्षम कर चुका हूं लेकिन कार्य अभी भी हल नहीं हुआ है। –

3

मुझे लगता है कि मुझे वही समस्या थी जहां सत्र का उपयोग मेरे अनुरोधों को एक साथ चल रहा था। चूंकि मैं पहले से ही सत्र में संशोधन नहीं कर रहा हूं, इस विशेषता के साथ मेरे नियंत्रक को सजाते हुए अनुरोधों को एक साथ चलने की अनुमति मिलती है।
[सत्रस्टेट (सत्रस्टेटबैवियर। रीडऑनली)]