尝试/捕获不捕获 HttpListenerException

Posted

技术标签:

【中文标题】尝试/捕获不捕获 HttpListenerException【英文标题】:Try/catch not catching HttpListenerException 【发布时间】:2019-08-25 00:29:33 【问题描述】:

我使用 Grapevine 制作了一个简单的 http 端点(它只是 HttpListener 的一个接口)。有时连接会在我SendResponse 之前断开,这会导致 HttpListenerException,但我不明白为什么 try/catch 不处理异常并且整个服务器崩溃。

错误:

Application: Movimiento de Placas.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.Net.HttpListenerException
Stack:
   at System.Net.HttpResponseStream.Write(Byte[], Int32, Int32)
   at Grapevine.Interfaces.Server.HttpResponse.SendResponse(Byte[])
   at Grapevine.Server.HttpResponseExtensions.SendResponse(Grapevine.Interfaces.Server.IHttpResponse, System.String)
   at Grapevine.Server.Router.Route(System.Object)
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

代码:

[RestRoute(HttpMethod = HttpMethod.POST, PathInfo = "/patente")]
        public IHttpContext ModificarPantalla(IHttpContext context)
        
            var dict = HttpUtility.ParseQueryString(context.Request.Payload);
            var json = new javascriptSerializer().Serialize(
                dict.Keys.Cast<string>()
                    .ToDictionary(k => k, k => dict[k]));
            var contenido = JsonConvert.DeserializeObject<Patente>(json);
            Server.FormRef.CargarPatente(contenido.Plate, contenido.idCamera);
            UltimaFoto.Fecha = DateTime.Now;
            Task.Run(() => Sqlite.InsertarPatente(contenido));
            try
            
                context.Response.SendResponse(HttpStatusCode.Ok); //exception occurs here
            
            catch (Exception ex)
            

            

            return context;
        

【问题讨论】:

你的捕获没有任何作用。即使你确实捕获了异常,你会怎么做? 避免整个程序崩溃,这才是重点。当连接断开时,我不需要做任何事情。 @Vallo 我刚刚发布了 4.1.2,应该很快就会在 nuget.org 上提供 【参考方案1】:

这是一个已知问题。有一个 PR 已经解决了一段时间了,现在我正在合并它,以及将添加对 .NET Standard 的支持的更新。这应该会在本周末提供。

更新:Grapevine 4.1.2 于 2019 年 8 月 9 日在 Nuget.org 上可用

【讨论】:

【参考方案2】:

如果 SendResponse 是异步的并且您没有等待它,则可能会发生这种情况。

【讨论】:

SendResponse 不是异步的。 namespace Grapevine.Server public static class HttpResponseExtensions public static void SendResponse(this IHttpResponse response, HttpStatusCode statusCode); 我想知道在那个方法的某个地方是否更深层次的情况。一些 Task.Run 调用可能就像您在示例中一样。我看不出它会如何逃脱那个块。也许异常是从其他地方抛出的,你认为它来自那个尝试? 很确定这是导致它的行,因为这是我程序中的唯一端点。我应该开始查看 Grapevine 源代码以了解为什么没有捕获到异常。

以上是关于尝试/捕获不捕获 HttpListenerException的主要内容,如果未能解决你的问题,请参考以下文章

等待没有尝试捕获[重复]

尝试捕获失败的包含

在线游戏中打印窗口不捕获

NSKeyedUnarchiver - 需要尝试/捕获?

尝试使用 VNFaceObservation 捕获 x: y: 位置

无法在 Vue.JS 上捕获自定义事件