ObjectDisposedException on shutdown
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 32/100
Hướng nghiên cứu
Bắt đầu với WebApiAppBuilderExtensions.cs và HttpMessageHandlerAdapter.cs tại phần đăng ký giải phóng liên quan, sau đó theo dõi luồng host.OnAppDisposing và HostingEnvironment.StopListening. Xác định cách việc giải phóng có thể tránh làm gián đoạn các request đang xử lý và sự kiện hoặc cơ chế vòng đời nào nên thực hiện việc giải phóng cuối cùng; hoàn tất khi quá trình shutdown không còn gây ra ObjectDisposedException và các tài nguyên cuối cùng được dọn dẹp.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
An app running in IIS with OWIN integration gets ObjectDisposedExceptions on shutdown rather than gracefully draining requests.
Exception Details: System.ObjectDisposedException, Cannot access a disposed object.
Object name: '[Redacted].AuthenticationHandler'.,
at System.Net.Http.DelegatingHandler.CheckDisposed()
at System.Net.Http.DelegatingHandler.SetOperationStarted()
at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
at [Redacted].AuthenticationHandler.<SendAsync>d__12.MoveNext()
Here's where dispose is called:
at [Redacted].AuthenticationHandler.Dispose(Boolean disposing)
at System.Net.Http.DelegatingHandler.Dispose(Boolean disposing)
at System.Web.Http.HttpServer.Dispose(Boolean disposing)
at System.Net.Http.HttpMessageInvoker.Dispose(Boolean disposing)
at System.Web.Http.Owin.HttpMessageHandlerAdapter.OnAppDisposing()
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.CancellationCallbackInfo.ExecuteCallback()
at System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException)
at System.Threading.CancellationTokenSource.NotifyCancellation(Boolean throwOnFirstException)
at Microsoft.Owin.Host.SystemWeb.ShutdownDetector.Cancel()
at Microsoft.Owin.Host.SystemWeb.ShutdownDetector.Stop(Boolean immediate)
at System.Web.Hosting.HostingEnvironment.StopRegisteredObjects(Boolean immediate)
at System.Web.Hosting.HostingEnvironment.InitiateShutdownWorkItemCallback(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
at System.Threading.ThreadPoolWorkQueue.Dispatch()'
The root event here is HostingEnvironment.StopListening. "Occurs when the worker process or application pool associated with this host has stopped listening for new requests and will eventually shut down." The app is shutting down, but there may still be requests in flight that should be completed if possible.
Microsoft.Owin wired into the StopListening event so that SignalR could gracefully shut down long polling and WebSocket requests. WebAPI however wired up it's pipeline disposal to this event. This causes the pipeline to be disposed while request are in flight.
https://github.com/aspnet/AspNetWebStack/blob/ba26cfbfbf958d548e4c0a96e853250f13450dc6/src/System.Web.Http.Owin/WebApiAppBuilderExtensions.cs#L111
https://github.com/aspnet/AspNetWebStack/blob/ba26cfbfbf958d548e4c0a96e853250f13450dc6/src/System.Web.Http.Owin/WebApiAppBuilderExtensions.cs#L119-L128
https://github.com/aspnet/AspNetWebStack/blame/ba26cfbfbf958d548e4c0a96e853250f13450dc6/src/System.Web.Http.Owin/HttpMessageHandlerAdapter.cs#L87
There is no alternate event in IIS that fires when requests have drained.
Workaround: Remove the CancellationToken from the IAppBuilder so WebAPI cannot register with it.
appBuilder.Properties.Remove("host.OnAppDisposing");
Proposed fix: WebApi should not register for disposal with this event.
https://github.com/aspnet/AspNetWebStack/blame/ba26cfbfbf958d548e4c0a96e853250f13450dc6/src/System.Web.Http.Owin/HttpMessageHandlerAdapter.cs#L87
(When should it be disposed then?)
- Ngôn ngữ chính
- C#
- Star
- 897
- Fork
- 358
- Merge trung bình
- 40 phút
- Pull request đã merge (30 ngày)
- 1
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của aspnet/AspNetWebStack
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 45/100
aspnet/AspNetWebStack#431 · 1 bình luận ·
-
Needs: Author Feedback
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
aspnet/AspNetWebStack#430 · 2 bình luận ·
-
Needs: Author Feedback
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
aspnet/AspNetWebStack#429 · 1 bình luận ·
-
Needs: Author Feedback
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
aspnet/AspNetWebStack#428 · 1 bình luận ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 45/100
aspnet/AspNetWebStack#407 · 1 bình luận ·
Tất cả issue của aspnet/AspNetWebStack
Issue tương tự
-
core dependencies
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 80/100
-
bug frontend good first issue
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
-
NavigationViewItemAutomationPeer implements IInvokeProvider but never advertises the Invoke pattern Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
unoplatform/uno#24629 ·
-
agentic-workflows Needs: Triage :mag: State: In-PR
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
-
Down / Waiting for removal
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100