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
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);
}
Czy używasz sesji ASP.NET w działaniu kontrolera? –
@Darin Tak, jesteśmy. – Matt
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. –