如何返回Json对象以在Async方法中查看

时间:2011-02-28 11:06:44

标签: javascript json asp.net-mvc-2 asynchronous


我有ASP.NET MVC 2网络应用程序。在页面加载时,我调用了一个javascript方法:

function getSomeData() {
  $.post(GetTablesDataUrl, null,
            function (data) {
               alert(data);
        });
}

然后在我的HomeController.cs中调用一个方法

public void GetTablesData()
{
  WebClient webClinet = new WebClient();
  webClinet.DownloadDataAsync( new Uri("http://somer_url"));
  webClinet.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClinet_DownloadDataCompleted);
}

下载完成后,执行下一个方法

void webClinet_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
  byte[] responseArray = e.Result;

  string s = responseArray.ToString();

  ReturnDataToPage(s);  // return json object
}

inside是将数据返回到我的页面的方法

[AcceptVerbs(HttpVerbs.Post)]
public JsonResult ReturnDataToPage(string s)
{
  var data = s;
  return Json(data);
}  

但我总是得到一个空字符串。我做错了什么???

2 个答案:

答案 0 :(得分:2)

您有两种可能性:

  1. 使用普通控制器,因为AJAX调用已经异步,您可能不需要更多:

    public class TablesController : Controller
    {
        [HttpPost]
        public ActionResult ReturnTables(string s)
        {
            using (var client = new WebClient())
            {
                string result = client.DownloadString("http://example.com");
                // Assuming the remote address returns a JSON object
                // if not parse the response and return Json
                return Content(result, "application/json");
            }
        }
    }
    
  2. 使用异步控制器和IOCP(I / O完成端口):

    public class TablesController : AsyncController
    {
        [HttpPost]
        public void ReturnTablesAsync(string s)
        {
            AsyncManager.OutstandingOperations.Increment();
            var client = new WebClient();
            client.DownloadStringCompleted += (sender, e) =>
            {
                try
                {
                    AsyncManager.Parameters["result"] = e.Result;
                }
                finally
                {
                    AsyncManager.OutstandingOperations.Decrement();
                }
            };
            client.DownloadStringAsync(new Uri("http://www.example.com"));
        }
    
        public ActionResult ReturnTablesCompleted(string result)
        {
            // Assuming the remote address returns a JSON object
            // if not parse the response and return Json
            return Content(result, "application/json");
        }
    }
    
  3. 在这两种情况下,您都会以相同的方式使用这些操作:

    // Not sure exactly what was the purpose of the "s" query string
    // parameter as I am not using it in the action
    var data = { s: 'some data' };
    $.post('<%= Url.Action("ReturnTables", "Tables") %>', data, function(result) {
        // Do something with the result
    });
    

    这两种方法的区别在于异步版本将使用I / O完成端口,并且在检索远程资源期间不会阻止任何工作线程。

答案 1 :(得分:0)

您的方法的主要问题是您异步调用外部站点(“http:// somer_url”)。

这意味着'someDataDataUrl'调用的操作(我假设,你的问题中没有显示)将立即返回,这可能是在异步调用返回实际数据之前。

次要问题(如果我对你的理解 - 可能是错误的 - 问题是正确的)是,当调用异步调用处理程序时,它调用'ReturnDataToPage'(这应该是'ReturnTables'吗?),然后什么都不做它获得的JsonResult。

最好同时调用外部站点(尽管这会引入块问题,因此需要引入超时)并正确返回此调用的结果。

然而,这样做需要进行一些额外的研究(不是我从.NET做过的事情,我担心)