2017-11-02 1 views
0

ASP.NET MVC 응용 프로그램을 STA 모드로 실행해야합니다. 이 목적을 위해 Programming ASP.NET MVC 4: Developing Real-World Web Applications with ASP.NET MVC을 기반으로 맞춤 클래스를 개발했습니다. 여기에 그들이있다 : 또한 RouteConfig 조정STA MVC 응용 프로그램이 장기 실행 요청을 끝내지 못합니다.

public class StaThreadRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     if (requestContext == null) 
      throw new ArgumentNullException("requestContext"); 

     return new StaThreadHttpAsyncHandler(requestContext); 
    } 
} 

public class StaThreadHttpAsyncHandler : Page, IHttpAsyncHandler, IRequiresSessionState 
{ 
    private readonly RequestContext _requestContext; 
    public StaThreadHttpAsyncHandler(RequestContext requestContext) 
    { 
     if (requestContext == null) 
      throw new ArgumentNullException("requestContext"); 

     _requestContext = requestContext; 
    } 

    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) 
    { 
     return this.AspCompatBeginProcessRequest(context, cb, extraData); 
    } 

    protected override void OnInit(EventArgs e) 
    { 
     var controllerName = _requestContext.RouteData.GetRequiredString("controller"); 
     var controllerFactory = ControllerBuilder.Current.GetControllerFactory(); 
     var controller = controllerFactory.CreateController(_requestContext, controllerName); 
     if (controller == null) 
      throw new InvalidOperationException("Could not find controller: " + controllerName); 
     try 
     { 
      controller.Execute(_requestContext); 
     } 
     finally 
     { 
      controllerFactory.ReleaseController(controller); 
     } 
     this.Context.ApplicationInstance.CompleteRequest(); 
    } 

    public void EndProcessRequest(IAsyncResult result) 
    { 
     this.AspCompatEndProcessRequest(result); 
    } 

    public override void ProcessRequest(HttpContext httpContext) 
    { 
     throw new NotSupportedException("STAThreadRouteHandler does not support ProcessRequest called (only BeginProcessRequest)"); 
    } 
} 

:

routes.Add(new Route("{controller}/{action}/{id}", new StaThreadRouteHandler())) 

모든 것은 내 행동의 대부분 잘 작동하지만 내가 마무리 할 곳 10 20 초 사이에 걸릴 두 가지가 있습니다. 이 두 가지 동작의 경우 EndProcessRequest 메서드는 실행 도중 예외가 throw되지 않고 this.Context.ApplicationInstance.CompleteRequest();이 아무런 문제없이 OnInit 내에서 호출 되더라도 실행되지 않습니다. 결과적으로 이러한 요청은 상태가 ExecuteRequestHandler 인 IIS에서 끝나며 영원히 머물러 있고 새로운 요청이 제공되는 것을 차단합니다. enter image description here

왜 이런 일이 발생합니까? 왜 EndProcessRequest의 중단 점은 장기 실행 작업에는 절대로 안타깝지만 짧은 동작 (1-5 초)에서는 정상적으로 작동합니다.

답변

0

문제는 특정 작업의 실행 시간과 관련이 없습니다. 후드 아래에서 무슨 일이 일어 났는지는 확실치 않지만 문제가되는 모든 액션에는 공통점이 있습니다. 특정 COM 객체를 만드는 중이 었는데, 어떻게 든 제대로 파괴되지 않았으므로 결과적으로 EndProcessRequest이 호출되지 않았습니다.

모든 .NET COM 개체에서 문제가 발생했습니다. 기본 COM 개체는 괜찮으며 EndProcessRequest이 호출됩니다.

관련 문제