У меня есть класс с WebMethod, который выглядит так ...
[Authorize]
public class ControllerNameAjaxController : ControllerNameController
{
[HttpGet]
[WebMethod]
public ActionResult MethodName(string var1, string var2, ...)
{
try
{
ApplicationDbContext db = new ApplicationDbContext();
string UserId = User.Identity.GetUserId();
// and so on to return some results *output -> ResultsObject*
var converted = JsonConvert.SerializeObject(ResultsObject);
return new ContentResult { Content = converted, ContentType = "application/json" };
}
catch (Exception e)
{
//Error
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
return Json(new { });
}
}
}
, и я вызываю AJAX вот так ...
$.ajax({
type: "GET",
url: '/ControllerName/MethodName',
contentType: "application/json; charset=utf-8",
data: { var1, var2, ... },
dataType: "json",
success: function (data) { },
error: function (xhr, status, error) {}
});
вот как Мои методы просмотра:
public ActionResult Index()
{
ViewModel model = new ViewModel();
return View(model);
}
Теперь вызов работает нормально, но страница зависает, пока WebMethod выполняет задачу. Итак, если пользователь должен был щелкнуть по сайту и go перейти на другую страницу. Они не могут, пока не завершится WebMethod.
Я где-то читал, что это связано с тем, что все это находится в одном потоке, или что он разрешает только один поток за раз. Но не смог понять это после нескольких часов.
Я пробовал использовать await Task.Run(() => );
и изменять атрибуты WebMethod, такие как [WebMethod(EnableSession = false)]
, из других ответов, которые встречаются.
Я надеялся, что кто-нибудь укажет мне правильное направление или найдет какое-нибудь простое решение этой проблемы.