在这个question & answer中,我找到了一种使ASP.NET MVC支持异步处理的方法。然而,我无法使它发挥作用。
基本上,我们的想法是创建一个只有一个方法GetHttpHandler.的IRouteHandler的新实现。GetHttpHandler方法应该返回一个IHttpAsyncHandler实现,而不是仅返回IHttpHandler,因为IHttpAsyncHandler具有Begin/EndXXXX模式API。
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();
}
}
}然后,在文件AsyncMvcRouteHandler.的RegisterRoutes方法中注册这个类Global.asax.cs
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.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实现来处理。
如何使AsyncMvcHandler作为IHttpAsyncHandler对待ASP.NET,这样就可以进行异步页面处理?
发布于 2008-11-12 02:30:38
经过几个小时与代码的争论,我发现了这个问题。
在我的Visual 2008中,当我按Ctrl+F5时,应用程序开发服务器被启动,IE弹出以访问"http://localhost:3573/“。在这种情况下,调用同步API ProcessRequest。堆栈跟踪是这样的。
( MyMvcApplication.DLL!MyMvcApplication.AsyncMvcRouteHandler.AsyncMvcHandler.ProcessRequest(System.Web.HttpContext httpContext = {System.Web.HttpContext})第59行C# httpHandler,System.Web.HttpContextBase httpContext) + 0x19字节
( System.Web.Routing.dll!System.Web.Routing.UrlRoutingHandler.ProcessRequest(System.Web.HttpContextBase httpContext) + 0x66字节
( System.Web.Routing.dll!System.Web.Routing.UrlRoutingHandler.ProcessRequest(System.Web.HttpContext httpContext) + 0x28字节
( System.Web.Routing.dll!System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest(System.Web.HttpContext上下文)+ 0x8字节
MyMvcApplication.DLL!MyMvcApplication._Default.Page_Load(object发件人= {ASP.default_aspx},System.EventArgs e= {System.EventArgs})行13 + 0x1a字节C#
但是,当我将IE中的URL更改为"http://localhost:3573/whatever.mvc“时,它就会命中http://localhost:3573/whatever.mvc堆栈跟踪是这样的。
MyMvcApplication.DLL!MyMvcApplication.AsyncMvcRouteHandler.AsyncMvcHandler.BeginProcessRequest(System.Web.HttpContext上下文= {System.Web.HttpContext},System.AsyncCallback cb ={
= {Void OnAsyncHandlerCompletion(System.IAsyncResult)}},第66行System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x249字节System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step = {System.Web.HttpApplication.CallHandlerExecutionStep},ref bool completedSynchronously = true) + 0x9c字节
System.Web.dll!System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(System.Exception错误)+ 0x133字节
System.Web.dll!System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(System.Web.HttpContext上下文、System.AsyncCallback cb、object extraData) + 0x7c字节
System.Web.dll!System.Web.HttpRuntime.ProcessRequestInternal(System.Web.HttpWorkerRequest wr = {Microsoft.VisualStudio.WebHost.Request}) + 0x17c字节System.Web.dll!System.Web.HttpRuntime.ProcessRequestNoDemand(System.Web.HttpWorkerRequest wr) + 0x63字节
System.Web.dll!System.Web.HttpRuntime.ProcessRequest(System.Web.HttpWorkerRequest wr) + 0x47字节
WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Request.Process() + 0xf1字节WebDev.WebHost.dll!Microsoft.VisualStudio.WebHost.Host.ProcessRequest(Microsoft.VisualStudio.WebHost.Connection conn) + 0x4e字节
似乎只有带有".mvc“后缀的url才能调用异步API。
发布于 2009-01-29 00:17:14
我也遇到了同样的问题,但是我发现这是因为我捕获了所有的路由处理程序:
routes.MapRoute(
"Default",
"{controller}/{action}",
new { controller = "Home", action = "Index" }
);是接收请求,而不是我添加的处理异步路由处理程序的自定义路由。也许,通过在自定义路由定义中使用.mvc,您可以创建一个区分,以便使用它,而不是同步捕获。
发布于 2008-11-10 19:07:18
我过去曾尝试过这样做,我设法得到视图来呈现,然后所有的异步任务都会完成。或要完成的异步任务,但视图不会呈现。
我创建了一个基于原始MVC代码的RouteCollectionExtensions。在我的AsyncMvcHandler中,我有一个ProcessMethod的空方法(毫无例外)。
https://stackoverflow.com/questions/276867
复制相似问题