문제

이것에서 질문 답변, ASP.NET MVC가 비동기 처리를 지원하는 한 가지 방법을 찾았습니다. 그러나 나는 그것을 작동시킬 수 없습니다.

기본적으로 아이디어는 하나의 방법 만있는 IrouteHandler의 새로운 구현을 만드는 것입니다. gethttphandler. 그만큼 gethttphandler ihttpasynchandler가 시작/ENDXXXX Pattern API를 시작했기 때문에 메소드는 IHTTPHANDLER 대신 IHTTPASYNCHANDLER 구현을 반환해야합니다.

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();
        }
    }
}

그런 다음, global.asax.cs의 registerroutes 메소드 에서이 클래스를 등록하십시오. asyncmvcroutehandler. public static void regis

        routes.Add(new Route("{controller}/{action}/{id}", new AsyncMvcRouteHandler())
        {
            Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
        });
    }

나는 중단 점을 설정했다 ProcessRequest, 시작 처리장 그리고 endprocessRequest. 뿐 ProcessRequest 실행됩니다. 다른 말로도 Asyncmvchandler 구현 ihttpasynchandler. ASP.NET MVC는이를 알지 못하고 IHTTPHANDLER 구현으로 처리합니다.

ASP.NET MVC를 처리하는 방법 Asyncmvchandler ~처럼 ihttpasynchandler 그래서 우리는 비동기 페이지 처리를 할 수 있습니까?

도움이 되었습니까?

해결책 2

코드와 몇 시간의 번거 로움을 겪은 후, 나는 문제를 발견했습니다.

CTRL+F5를 누르면 Visual Studio 2008에서 응용 프로그램 개발 서버가 시작되고 IE가 액세스하기 위해 팝업됩니다. "http : // localhost : 3573/".이 경우 SYNC API ProcessRequest 호출됩니다. 스택 추적은 이와 같습니다.

mymvcapplication.dll! mymvcapplication.asyncmvcroutehandler.asyncmvchandler.processrequest (system.web.httpcontext httpcontext = {system.web.httpcontext}) 줄 59 c# c# system.mvc.dll! web.ihttphandler 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 Context) + 0x8 바이트 바이트
mymvcapplication.dll! mymvcapplication._default.page_load (객체 sender = {asp.default_aspx}, system.eventArgs e = {system.eventargs}) 13 + 0x1a 바이트 C#

그러나 IE의 URL을 변경할 때 "http : // localhost : 3573/뭐든지 mvc", 그것은 쳤다 시작 처리장. 스택 추적은 이와 같습니다.

mymvcapplication.dll! mymvcapplication.asyncmvcroutehandler.asyncmvchandler.beginprocessrequest (system.web.httpcontext context = {system.web.httpcontext}, system.asynccallback cb = {void onulllerconcres} (systalllercont) ) 66 C# system.web.dll! system.web.httpapplication.callhandlerexecutionstep.system.web.httpapplication.iexecutionstep.execute () + 0x249 바이트 시스템 .web.dll! system.web.httpapplication.executestep (System.webb. httpapplication.iexecutionStep Step = {System.Web.httPapplication.callHandlerExecutionStep}, ref bool wompletedSynchronously = true) + 0x9c 바이트
system.web.dll! system.web.httpapplication.applicationstepmanager.resumesteps (System.Exception Error) + 0x133 바이트
System.Web.dll! System.Web.HttPapplication.System.web.ihttpasynchandler.beginProcessRequest (System.Web.httpContext Context, System.AsyncCallback CB, Object Extradata) + 0x7C Bytes
System.Web.dll! System.Web.HttPruntime.ProcessRequestInternal (System.Web.httpworkerRequest wr = {Microsoft.visualstudio.WebHost.Request}) + 0x17C Bytes System.Web.dll! System.HttPruntime.processRequescessRequescessRequescessrequscessednodmand. 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 bytes webdev.webhost.dll! microsoft.visualstudio.webhost.host.processRequest (microsoft.visualstudio.webhost.connection conn) + 0x4e BERTES.

".mvc"접미사가있는 URL만이 비동기 API를 호출 할 수있는 것 같습니다.

다른 팁

나는 같은 문제가 있었지만 내 모든 경로 처리기를 잡기 때문에 :

routes.MapRoute(
    "Default",                                                  
    "{controller}/{action}",                           
    new { controller = "Home", action = "Index" }  
);

비동기 경로 처리기를 다루는 사용자 정의 경로가 아니라 요청을 선택했습니다. 아마도 사용자 정의 경로 정의에서 .mvc를 사용하면 동기식 캐치가 아닌 사용되도록 구별을 만들었습니다.

나는 과거에 이것을 시도했지만, 렌더링을 볼 수있게되면 모든 비동기 작업이 완료 될 것입니다. 또는 완료 할 비동기 작업이지만보기는 렌더링되지 않습니다.

원래 MVC 코드를 기반으로 RoureCollectionExtensions를 만들었습니다. Asyncmvchandler에는 프로세스 메드에 대한 빈 메소드 (예외없이)가있었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top