2013-05-16 13 views
5

Mam powolne działanie na kontrolerze, który przekonwertowałem na nową metodę Async. Teraz działa znacznie szybciej, jednak wywołuje każdy jQuery Ajax do zwróci następujący ciąg,MVC 4.5 Nie działa asynchroniczne połączenie Ajax

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

zamiast czekania na async, aby zakończyć.

Co ja tu robię źle? Poszukiwałem każdego przykładu, który mogę znaleźć, a to nie jest rakieta do wdrożenia.

Dość dużo po co przedstawiono w tym filmie

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

I tym linkiem zbyt

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

Rozumiem, że asynchroniczny nie zmienia HTTP, ale to, co było Oczekiwano, że połączenie Ajax będzie długo działało w tle, a następnie powróci do użytkownika po zakończeniu. To by zwolniło serwer do przetworzenia dodatkowych wywołań ajaxowych zamiast ich blokowania.

Aktualizacja:

Oto kod javascript

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

I tu jest moje działania kontrolera w języku C#

[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

Czy używasz sesji ASP.NET w działaniu kontrolera? –

+0

@Darin Tak, jesteśmy. – Matt

+2

To jest twój problem. Sesja ASP.NET nie pozwala na wykonywanie równoległych żądań z tej samej sesji. Ponieważ sesja ASP.NET nie jest bezpieczna dla wątków, program ASP.NET po prostu zablokuje równoczesny dostęp do serwera z tej samej sesji i sprawi, że zaczekają i wykonają sekwencyjnie. Sesja ASP.NET wprowadza stan i wiele innych problemów w aplikacji i jest to zapach projektu. Jeśli chcesz mieć skalowalną i bezpaństwową aplikację, pierwszą rzeczą, którą powinieneś zrobić, to pozbyć się tego. –

Odpowiedz

12

Problemem jest to, że działanie po stronie serwera używa ASP.NET Session który charakteryzuje się tym, że nie jest bezpieczny dla wątków. W rezultacie program ASP.NET kolejkuje równoległe żądania z tej samej sesji i wykonuje je sekwencyjnie. Posiadanie RESTful API opierającego się na sesji jest bardzo złym projektem, a IMHO powinno zostać poddane rearchitekturze, aby nie polegało na stanie.

+0

Myślę, że mam ten sam problem. Ale nie rozumiem, jak wyłączyć sesję. Wyłączyłem już w web.config, ale zadanie nie zostało jeszcze rozwiązane. –

3

Myślę, że miałem ten sam problem, gdy używanie sesji uniemożliwiało jednoczesne uruchamianie moich żądań. Ponieważ już nie modyfikuję sesji, dekorowanie kontrolera za pomocą tego atrybutu pozwala na jednoczesne uruchamianie żądań.
[SessionState (SessionStateBehavior.ReadOnly)]