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에서 끝나며 영원히 머물러 있고 새로운 요청이 제공되는 것을 차단합니다.
왜 이런 일이 발생합니까? 왜 EndProcessRequest
의 중단 점은 장기 실행 작업에는 절대로 안타깝지만 짧은 동작 (1-5 초)에서는 정상적으로 작동합니다.