MVC 4.5异步Ajax调用无法正常工作

时间:2013-05-16 19:27:48

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

我在控制器上运行缓慢,我已转换为新的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);
        }

2 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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