В этом вопросе и ответе я нашел один способ заставить ASP.NET MVC поддерживать асинхронную обработку. Однако я не могу заставить его работать.
По сути, идея заключается в том, чтобы создать новую реализацию IRouteHandler, которая имеет только один метод GetHttpHandler . Метод GetHttpHandler должен возвращать реализацию IHttpAsyncHandler, а не просто IHttpHandler, потому что IHttpAsyncHandler имеет API-шаблон Begin / EndXXXX.
public class AsyncMvcRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new AsyncMvcHandler(requestContext);
}
class AsyncMvcHandler : IHttpAsyncHandler, IRequiresSessionState
{
public AsyncMvcHandler(RequestContext context)
{
}
// IHttpHandler members
public bool IsReusable { get { return false; } }
public void ProcessRequest(HttpContext httpContext) { throw new NotImplementedException(); }
// IHttpAsyncHandler members
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
throw new NotImplementedException();
}
public void EndProcessRequest(IAsyncResult result)
{
throw new NotImplementedException();
}
}
}
Затем в методе RegisterRoutes файла Global.asax.cs зарегистрируйте этот класс AsyncMvcRouteHandler .
public static void RegisterRoutes (маршруты RouteCollection)
{
routes.IgnoreRoute ( "{ресурс} .axd / {* PathInfo}");
routes.Add(new Route("{controller}/{action}/{id}", new AsyncMvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
});
}
Я установил точку останова на ProcessRequest , BeginProcessRequest и EndProcessRequest . Только ProcessRequest выполняется. Другими словами, хотя AsyncMvcHandler реализует IHttpAsyncHandler . ASP.NET MVC этого не знает и просто обрабатывает это как реализацию IHttpHandler.
Как заставить ASP.NET MVC обрабатывать AsyncMvcHandler как IHttpAsyncHandler , чтобы мы могли выполнять асинхронную обработку страниц?