【问题标题】:Web API with OWIN throws ObjectDisposedException for HttpMessageInvoker带有 OWIN 的 Web API 为 HttpMessageInvoker 引发 ObjectDisposedException
【发布时间】:2016-01-28 21:52:23
【问题描述】:

我在 ASP.NET WebApi2 设置中使用 OWIN 时遇到了一些困难。重启后的第一个请求导致异常:

[ObjectDisposedException:无法访问已处置的对象。 对象名称:'System.Net.Http.HttpMessageInvoker'。] System.Net.Http.HttpMessageInvoker.CheckDisposed() +327456 System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancelToken) +24 System.Web.Http.Owin.d__0.MoveNext() +501 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext() +187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() +185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +69 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +64 System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +483 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +157 我相信这个问题是由第一次访问 EF DbContext 时长时间运行的任务引起的。总而言之,第一个请求大约是 4-6000 毫秒。在第一次请求之后,没有更多的例外。

我已通过 webapi 项目和以下 OWIN 启动(并且没有 global.asax)以简化形式重现了该问题:

public class Startup
{
    public void Configuration(IAppBuilder app) {
        var config = new HttpConfiguration();
        config.MapHttpAttributeRoutes();

        // ---- simulate long running initialization code -------
        Thread.Sleep(3000);
        // ------------------------------------------------------

        app.UseWebApi(config);
    }
}

我添加了一个控制器:

[Route("api/test/number")]
public class TestController : ApiController
{
    public object Get() {
        return 42;
    }
}

当我请求这个时,第一个请求会导致异常。

【问题讨论】:

  • 我也有同样的问题。也许如果没有人回应,应该报告给asp.net团队?
  • 我也遇到了同样的异常。我认为这是一个错误。

标签: asp.net asp.net-web-api2 owin


【解决方案1】:

这是一个老问题,但花了几个小时试图击败 ObjectDisposedException 并且刚刚找到了这个AspNetWebStack issue on codeplex 帮助我解决的解决方案:

当您的 owin web api 应该在自托管环境中运行时,您将 web api 配置绑定到 owin 启动类中

public void Configuration(IAppBuilder app)
{
    ConfigureOAuth(app);

    HttpConfiguration config = new HttpConfiguration();
    WebApiConfig.Register(config);
    app.UseWebApi(config);
}

如果您打算使用 IIS 作为 owin web api 的主机,则将 web api 配置绑定到全局 asax 类中

protected void Application_Start(object sender, EventArgs e)
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

这消除了 ObjectDisposedException,我的 web api 运行起来就像一个魅力

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2013-03-12
    • 2018-12-28
    相关资源
    最近更新 更多