首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使ASP.NET MVC从IRouteHandler.GetHttpHandler()中识别IHttpAsyncHandler?

如何使ASP.NET MVC从IRouteHandler.GetHttpHandler()中识别IHttpAsyncHandler?
EN

Stack Overflow用户
提问于 2008-11-10 01:49:34
回答 3查看 4.4K关注 0票数 4

在这个question & answer中,我找到了一种使ASP.NET MVC支持异步处理的方法。然而,我无法使它发挥作用。

基本上,我们的想法是创建一个只有一个方法GetHttpHandler.的IRouteHandler的新实现。GetHttpHandler方法应该返回一个IHttpAsyncHandler实现,而不是仅返回IHttpHandler,因为IHttpAsyncHandler具有Begin/EndXXXX模式API。

代码语言:javascript
复制
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

代码语言:javascript
复制
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 = "" }),
    });
}

我在ProcessRequestBeginProcessRequestEndProcessRequest.设置了断点只执行ProcessRequest。换句话说,即使AsyncMvcHandler实现了IHttpAsyncHandler.ASP.NET MVC不知道这一点,只是将其作为IHttpHandler实现来处理。

如何使AsyncMvcHandler作为IHttpAsyncHandler对待ASP.NET,这样就可以进行异步页面处理?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2009-01-29 00:17:14

我也遇到了同样的问题,但是我发现这是因为我捕获了所有的路由处理程序:

代码语言:javascript
复制
routes.MapRoute(
    "Default",                                                  
    "{controller}/{action}",                           
    new { controller = "Home", action = "Index" }  
);

是接收请求,而不是我添加的处理异步路由处理程序的自定义路由。也许,通过在自定义路由定义中使用.mvc,您可以创建一个区分,以便使用它,而不是同步捕获。

票数 3
EN

Stack Overflow用户

发布于 2008-11-10 19:07:18

我过去曾尝试过这样做,我设法得到视图来呈现,然后所有的异步任务都会完成。或要完成的异步任务,但视图不会呈现。

我创建了一个基于原始MVC代码的RouteCollectionExtensions。在我的AsyncMvcHandler中,我有一个ProcessMethod的空方法(毫无例外)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/276867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档