Как вернуть объект Json для просмотра в методе Async - PullRequest
0 голосов
/ 28 февраля 2011


У меня есть веб-приложение 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
}

внутри - это метод am для возврата данных на мою страницу следующим образом

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

, но я всегда получаю пустую строку.Что я делаю не так ???

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

У вас есть две возможности:

  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 (порты завершения ввода / вывода):

    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");
        }
    }
    

В обоих случаях вы будете использовать эти действия одинаково:

// 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
});

Разница между этими двумя подходами заключается в том, что асинхронная версия будет использовать порты завершения ввода / вывода и не будет блокировать какие-либо рабочие потоки во время получения удаленного ресурса.

0 голосов
/ 28 февраля 2011

Основная проблема вашего подхода заключается в том, что вы вызываете внешний сайт ("http://somer_url") асинхронно.

" Это означает, что действие, вызванное 'someDataDataUrl' (которое, я полагаю, не отображается вваш вопрос) немедленно вернется, и это, вероятно, до того, как асинхронный вызов вернется с вашими фактическими данными.

Вторичная проблема (если я правильно понимаю ваш - возможно, опечатка - вопрос правильный) - это когда асинхронный вызоввызывается обработчик, он вызывает ReturnDataToPage (должно ли это быть ReturnTables?), а затем ничего не делает с JsonResult, который он получает.проблемы с блоком, поэтому необходимо ввести таймауты) и правильно возвращать результат этого вызова.

Однако выполнение этого потребует дополнительных исследований (не то, что я сделал из .NET,Боюсь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...