¿Cómo puedo detectar excepciones SSL en un servidor Mono HTTPListener?

Estoy tratando de agregar soporte HTTPS a mi simple servidor Mono HTTP. Funciona perfectamente la mayor parte del tiempo, pero la aplicación se bloquea cuando se produce una excepción SSL, como que el cliente cancele el protocolo de enlace. Obviamente, algo así no debería bloquearlo por completo, por lo que necesito detectar esa excepción de alguna manera.

Código:

    static void Main(string[] args)
    {
        try
        {
            var listener = new HttpListener();
            string prefix = "https://*:8443/";
            listener.Prefixes.Add(prefix);

            Console.WriteLine("Starting HTTP server at " + prefix);

            listener.Start();

            while (true)
            {
                try
                {
                    var context = listener.GetContext();
                    Console.WriteLine(context.Request.Url);
                }
                catch (Exception e)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Exception processing request: " + e);
                    Console.ResetColor();
                }
            }
        }
        catch (Exception e)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Exception caught! " + e);
        }
    }

Aquí está el registro cuando recibo un cliente inestable que intenta conectarse:

Starting HTTP server at https://*:8443/

Unhandled Exception:
System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The client stopped the handshake.
  at Mono.Security.Protocol.Tls.SslServerStream.EndNegotiateHandshake (IAsyncResult asyncResult) <0x41e581b0 + 0x0022b> in <filename unknown>:0
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) <0x41e57d20 + 0x00086> in <filename unknown>:0
  --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.EndRead (IAsyncResult asyncResult) <0x41e50110 + 0x0015f> in <filename unknown>:0
  at Mono.Net.Security.Private.LegacySslStream.EndAuthenticateAsServer (IAsyncResult asyncResult) <0x41e50000 + 0x0003e> in <filename unknown>:0
  at Mono.Net.Security.Private.LegacySslStream.AuthenticateAsServer (System.Security.Cryptography.X509Certificates.X509Certificate serverCertificate, Boolean clientCertificateRequired, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation) <0x41e40990 + 0x00055> in <filename unknown>:0
  at System.Net.HttpConnection.Init () <0x41e3e0e0 + 0x0005f> in <filename unknown>:0
  at System.Net.HttpConnection..ctor (System.Net.Sockets.Socket sock, System.Net.EndPointListener epl, Boolean secure, System.Security.Cryptography.X509Certificates.X509Certificate cert) <0x41e3b670 + 0x003e7> in <filename unknown>:0
  at System.Net.EndPointListener.OnAccept (System.Object sender, System.EventArgs e) <0x41e3b210 + 0x002a7> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncEventArgs.OnCompleted (System.Net.Sockets.SocketAsyncEventArgs e) <0x41e3b1d0 + 0x0002e> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncEventArgs.Complete () <0x41e3b1b0 + 0x00013> in <filename unknown>:0
  at System.Net.Sockets.Socket.<AcceptAsyncCallback>m__0 (IAsyncResult ares) <0x41e3aa70 + 0x0037f> in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncResult+<Complete>c__AnonStorey0.<>m__0 (System.Object _) <0x41e3a980 + 0x0001d> in <filename unknown>:0
  at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () <0x7f22cac25460 + 0x0002f> in <filename unknown>:0
  at System.Threading.ThreadPoolWorkQueue.Dispatch () <0x7f22cac239e0 + 0x001d6> in <filename unknown>:0
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () <0x7f22cac252e0 + 0x00008> in <filename unknown>:0

Respuestas a la pregunta(1)

Su respuesta a la pregunta