2013-05-16 50 views
5

Yeni Async yöntemine dönüştürdüğüm denetleyici üzerinde yavaş çalışan bir eylem var. Şimdi, bu şu dizeyi dönmek için ancak herhangi jQuery Ajax aramalar çok daha hızlı yerine tamamlamak için zaman uyumsuz beklemedenMVC 4.5 Async Ajax çağrısı çalışmıyor

System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] 

çalışır.

Burada yanlış olan ne yapıyorum? Bulduğum her örneği takip ettim ve bunun uygulanması roket bilimi değil. Hemen hemen

çok

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

Ben zaman uyumsuz HTTP değişmez anlıyoruz bu video

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

Ve bu bağlantıda sıralanan ne uyguladım ama neydi uzun vadede Ajax çağrısı, arka planda çalışmak için beklemek ve daha sonra bitmiş olduğu zaman kullanıcıya geri döndü. Bu daha sonra sunucuyu, onları engellemek yerine ek ajax çağrılarını işlemek için serbest bırakırdı.

Güncelleme: İşte

burada javascript kodu

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

Ve C# benim denetleyicisi eylem

[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

Denetleyici eyleminizde ASP.NET Oturumu mu kullanıyorsunuz? –

+0

@Darin Evet. – Matt

+2

O zaman bu senin problemin. ASP.NET oturumu, aynı oturumdan paralel istekleri gerçekleştirmenize izin vermez. ASP.NET oturumu iş parçacığı güvenli olmadığından, ASP.NET yalnızca aynı oturumdaki sunucuya eşzamanlı erişimi engeller ve sıralı olarak bekleyip çalıştırır. ASP.NET Session, uygulamanızda eyalet ve diğer birçok problemi ortaya çıkarır ve tasarım kokusu verir. Ölçeklenebilir ve durum bilgisi olmayan bir uygulamaya sahip olmak istiyorsanız yapmanız gereken ilk şey kurtulmaktır. –

cevap

12

sorun, sunucu tarafı eylem ASP.NET Oturum kullandığı olmasıdır iplik güvenli olmayan ile karakterizedir. Sonuç olarak, ASP.NET paralel oturumları aynı oturumdan sıraya alır ve sırayla yürütür. Oturuma dayanan bir RESTful API'sine sahip olmak çok kötü bir tasarımdır ve IMHO, devlete güvenmemek için yeniden araştırılmalıdır.

+0

Aynı problemi düşünüyorum. Ama oturumun nasıl kapatılacağını anlamıyorum. Web.config'te zaten devre dışı bırakılmıştım ancak görev hala çözülmedi. –

3

Aynı zamanda Seans kullanmanın isteklerin eşzamanlı olarak çalışmasını önlediği aynı sorunu yaşadım. Zaten oturumu değiştirmediğim için, denetleyicimi bu öznitelikle dekore etmek, isteklerin şimdi eşzamanlı olarak çalışmasına izin veriyor.
[SessionState (SessionStateBehavior.ReadOnly)]

İlgili konular