【问题标题】:STA MVC application doesnt end long running requestsSTA MVC 应用程序不会结束长时间运行的请求
【发布时间】:2017-11-02 13:41:31
【问题描述】:

我需要在 STA 模式下运行我的 ASP.NET MVC 应用程序。为此,我开发了一些基于Programming ASP.NET MVC 4: Developing Real-World Web Applications with ASP.NET 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)");
    }
}

还调整了RouteConfig:

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

对于我的大多数操作来说一切正常,但我有两个操作需要 10 到 20 秒才能完成。对于这两个操作,方法EndProcessRequest 永远不会执行,即使在它们执行期间没有抛出异常并且this.Context.ApplicationInstance.CompleteRequest();OnInit 内被调用而没有问题。结果,此类请求以状态ExecuteRequestHandler 结束,并永远卡在那里,并且还会阻止新请求的服务。

为什么会这样?为什么EndProcessRequest 中的断点对于长时间运行的操作永远不会命中,而对于较短的操作(1-5 秒)却可以正常工作。

【问题讨论】:

    标签: c# asp.net asp.net-mvc iis com


    【解决方案1】:

    问题根本与特定操作的执行时间无关。不太确定幕后发生了什么,但所有有问题的操作都有一个共同点——它们正在创建一个特定的 COM 对象,我猜想它没有被正确地销毁,因此没有调用 EndProcessRequest

    任何 .NET COM 对象都会出现此问题,本机 COM 对象正常,并且调用了 EndProcessRequest

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2018-02-24
      相关资源
      最近更新 更多