【问题标题】:MVC 4.5 Async Ajax call not workingMVC 4.5 异步 Ajax 调用不起作用
【发布时间】:2015-05-06 04:11:06
【问题描述】:

我在已转换为新 Async 方法的控制器上运行缓慢的操作。它现在运行得更快了,但是任何 jQuery Ajax 调用它都会返回以下字符串,

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

而不是等待异步完成。

我在这里做错了什么?我已经按照我能找到的所有示例进行了操作,而这并不是要实施的火箭科学。

几乎遵循了此视频中的概述

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 调用在后台工作,然后在完成后将结果返回给用户。然后,这将释放服务器来处理额外的 ajax 调用,而不是阻止它们。

更新:

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

这是我在 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);
        }

【问题讨论】:

  • 您是否在控制器操作中使用 ASP.NET Session?
  • 那是你的问题。 ASP.NET 会话不允许您从同一会话执行并行请求。由于 ASP.NET 会话不是线程安全的,ASP.NET 将简单地阻止从同一会话对服务器的并发访问,并使它们等待并按顺序执行。 ASP.NET 会话在您的应用程序中引入了状态和许多其他问题,这是一种设计气味。如果您想拥有一个可扩展且无状态的应用程序,您应该做的第一件事就是摆脱它。
  • @Darin 感谢您的帮助。我们将尝试围绕这个改变我们的架构。我很惊讶找到这方面的信息有多么困难。如果您提交答案,我会非常乐意将其标记为已接受。
  • 我已经发表了我的评论作为答案。

标签: jquery asp.net-mvc-4 async-await


【解决方案1】:

问题是您的服务器端操作使用 ASP.NET 会话,其特点是不是线程安全的。因此,ASP.NET 将来自同一会话的并行请求排队并按顺序执行它们。依赖会话的 RESTful API 是一个非常糟糕的设计,恕我直言,应该重新架构,使其不依赖于状态。

【讨论】:

  • 我认为有同样的问题。但我不明白如何禁用会话。我已经在 web.config 中禁用了,但任务仍然没有解决。
【解决方案2】:

我认为我遇到了同样的问题,即使用 Session 会阻止我的请求同时运行。由于我还没有修改会话,因此使用此属性装饰我的控制器允许请求现在同时运行。
[SessionState(SessionStateBehavior.ReadOnly)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2019-06-19
    相关资源
    最近更新 更多