加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – 处理Microsoft.Owin.Hosting.WebApp会抛出’System.Obje

发布时间:2020-12-14 04:14:21 所属栏目:Windows 来源:网络整理
导读:我们的 WPF应用程序中有一个自托管的SignalR服务器. WebApp在应用程序启动时启动.在应用程序退出时,我们处理WebApp. public void Start() { myWebApp = WebApp.StartMyApp(url); } private void Dispose(bool isDisposing) { if (disposed) return; if (isDi
我们的 WPF应用程序中有一个自托管的SignalR服务器. WebApp在应用程序启动时启动.在应用程序退出时,我们处理WebApp.
public void Start()
    {
        myWebApp = WebApp.Start<MyApp>(url);
    }

    private void Dispose(bool isDisposing)
    {
        if (disposed) return;

        if (isDisposing)
            myWebApp.Dispose();

        disposed = true;
    }

对myWebApp.Dispose()的调用引发了’System.ObjectDisposedException’.
难道我做错了什么? Microsoft.Owin.* dll具有版本2.1.0和SignalR自托管2.0.3

更新:事实证明这是我在visual studio中可以看到的第一个机会异常,因为设置“破坏clr异常”是活动的.这个异常似乎是在内部处理的,并没有冒出我们的代码

在探索了Katana源代码之后,我发现了这个问题的原因.它是Microsoft.Owin.Host.HttpListener.OwinHttpListener.ProcessRequestsAsync()方法.它启动while循环,包含在try-catch部分中的私有HttpListener实例的_listener.GetContextAsync()调用.

类也实现了IDisposable并包含Dispose()方法.此方法处理私有HttpListener实例.

当你调用WebApp.Start()时,它返回一个IDisposable实例,它只有Dispose()方法,它处理OwinHttpListener.

因此,当你处理它时,你调用它的OwinHttpListener的Dispose()方法,它处理私有的HttpListener.

但同时ProcessRequestsAsync()调用_listener.GetContextAsync(),但_listener已经处理并抛出ObjectDisposedException. catch块记录异常并从ProcessRequestsAsync()返回.

我认为,ProcessRequestsAsync()中的双重检查锁可能是一个不错的选择.

private async void ProcessRequestsAsync()
{
    while (_listener.IsListening && CanAcceptMoreRequests)
    {
        Interlocked.Increment(ref _currentOutstandingAccepts);
        HttpListenerContext context;
        try
        {
            context = await _listener.GetContextAsync();
        }
        (SOME_OTHER_CATCHES)
        catch (ObjectDisposedException ode)
        {
            // These happen if HttpListener has been disposed
            Interlocked.Decrement(ref _currentOutstandingAccepts);
            LogHelper.LogException(_logger,"Accept",ode);
            return;
        }
        (SOME_OTHER_CODE)
    }
}

public void Dispose()
{
    if (_listener.IsListening)
    {
        _listener.Stop();
    }

    ((IDisposable)_listener).Dispose();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读