ASP.net MVC Futures AsyncController: обработка проверки сервера - PullRequest
1 голос
/ 09 августа 2009

Я хочу иметь возможность проверить входные данные формы перед запуском длительной асинхронной задачи.

Два подхода, которые приходят на ум:

  1. Проверьте значения в методе Begin и бросить исключение?
  2. Пост в нормальном режиме (синхронный метод), который проверяется в соответствии с нормальным перенаправляет на асинхронный метод, если ошибок не найдено.

Бросить исключение, я подумал, было бы простым решением. Я не могу вернуть представление из метода begin, поэтому исключение обрабатывается в методе end. Только это не доходит до конечного метода (я думал, что это нормальный шаблон)

Проверка в обычном синхронном методе - это хорошо ... но как передать или перенаправить запрос в асинхронный метод ???

1 Ответ

1 голос
/ 10 августа 2009

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

Вот простой пример этого, где мы используем фиктивный делегат для возврата в случае ошибки (в данном случае неверный идентификатор):

public class MyAsyncController : AsyncController
{
    public IAsyncResult BeginFoo(int id, AsyncCallback callback, object state)
    {
        Action errorDelegate = () => ViewData["errors"] = "Invalid ID";
        // Here's our validation check, return the error delegate if necessary
        if (id <= 0) return errorDelegate.BeginInvoke(callback, state);

        var webRequest = WebRequest.Create("http://www.apple.com");
        return webRequest.BeginGetResponse(callback, webRequest);
    }

    public ActionResult EndFoo(IAsyncResult asyncResult)
    {
        if (asyncResult.AsyncState is WebRequest)
        {
            var webRequest = (WebRequest) asyncResult.AsyncState;
            var httpResponse = (HttpWebResponse) webRequest.EndGetResponse(asyncResult);
            ViewData["status"] = httpResponse.StatusCode;
        }
        return View();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...