Я понимаю, жду ждет для выполнения задачи (ожидаемой). Но я смущен тем, что на самом деле означает.Async WebApi ActionFilterAttribute. Асинхронный модуль или обработчик завершен, пока асинхронная операция все еще находится на рассмотрении
Код, который не работы:
public async override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response.Content != null)
{
var responseContent = await actionExecutedContext.Response.Content.ReadAsStringAsync();
DoSomething(responseContent);
}
}
Код, который делает работы:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if (actionExecutedContext.Response.Content != null)
{
var responseContent = actionExecutedContext.Response.Content.ReadAsStringAsync().ContinueWith(
task =>
{
DoSomething(task.Result);
});
}
}
Очевидно, что сообщение об ошибке Асинхронный модуль или обработчик завершения время асинхронная операция продолжалась. говорит мне, что не было ожиданий завершения асинхронного вызова, но вместо этого продолжался «основной» поток. Я ожидал продолжения потока, но не в текущем методе. Я думал, что поток вернется в стек asp.net, выполнит какую-то другую работу и вернется после завершения операции asyncOperation().
Я также использую ожидание в других местах (например, ожидая ответов на веб-службу) - и я не сталкивался с подобными проблемами в любом месте. Интересно, почему IActionFilterAttribute ведет себя по-другому. На самом деле мои вызовы веб-службы, вероятно, занимают больше времени, чем чтение содержимого ответа в строку.
Может кто-нибудь, пожалуйста, просветит меня? У меня такое чувство, что я не понял эту концепцию.
Фильтры действий (часть MVC, а не WebAPI) не поддерживают асинхронные операции. Если вам нужен фильтр асинхронных действий, попробуйте вместо этого использовать обработчик сообщений. О, и [проголосовать здесь] (http://aspnet.codeplex.com/workitem/9582). –
Это вопрос WebAPI, и я использую правильный ActionFilterAttribute (System.Web.Http ...) - вы говорите, что он должен работать? :) – lapsus
Я вижу. В этом случае вам, вероятно, потребуется определить свой собственный «AsyncActionFilterAttribute» и реализовать «IActionFilter.ExecuteActionFilterAsync». –