Pergunta

I have a function in a WCF web service that is in charge of sending a notification through SignalR every time a Evento entry is made, also it checks if the Cluster related to the Evento entry had three or more entries in the last hour, if so, then another notification is sent.

The function looks like this:

public static void SendEvento(string dispositivoId, Eventos evento)
    {
        Connection conn = new Connection("http://localhost:65097/Index");
        Model1Container context = new Model1Container();
        try
        {
            conn.Start().Wait();
            context.Database.Connection.Open();
            Dispositivos dispositivo = DispositivosDao.GetDispositivo(dispositivoId);
            Pin pin = new Pin(dispositivo.Latitud, dispositivo.Longitud, evento.Fecha, evento.IntensidadMax, dispositivo.UniqueId, dispositivo.Alias);
            List<Pin> lista = new List<Pin>();
            lista.Add(pin);
            var json = new JavaScriptSerializer().Serialize(lista);
            //send the notification
            conn.Send(json).Wait();
            Clusters cluster = ClustersDao.GetCluster(dispositivo.ClustersClusterId);
            List<Dispositivos> dispositivos = cluster.Dispositivos.ToList();
            var cont = 0;
            List<Eventos> listaEventosCluster = new List<Eventos>();
            for (var i = 0; cont < 3 && i < dispositivos.Count(); i++)
            {
                listaEventosCluster.AddRange(dispositivos.ElementAt(i).Eventos.ToList<Eventos>());
            }
            if (listaEventosCluster.Count() > 0)
            {
                listaEventosCluster.OrderByDescending(e => e.Fecha);
                DateTime endHour = evento.Fecha;
                DateTime startHour = endHour.AddHours(-1);
                var inHour = listaEventosCluster.Where(o => o.Fecha >= startHour && o.Fecha <= endHour);
                int count = inHour.Count();
                if (count >= 2)
                {
                    //send another notification if there're 3 or more entries in the last hour
                    json = new JavaScriptSerializer().Serialize(new { Alerta = "Sismo" });
                    conn.Send(json).Wait();
                }
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Error " + ex.Message + " \n Inner Exception " + ex.InnerException + " \n Stack Trace " + ex.StackTrace);
        }
        finally
        {
            conn.Stop();
            conn.Disconnect();
        }
    }

I have no problem sending the notification, but an exception is thrown eveytime there's 3 or more entries in the last hour.

This is the output I get for the Exception:

iisexpress.exe Error: 0 : SignalR exception thrown by Task: System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)
   at Microsoft.AspNet.SignalR.Infrastructure.StreamExtensions.<>c__DisplayClass4.<ReadAsync>b__1(IAsyncResult ar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)
   at Microsoft.AspNet.SignalR.Infrastructure.StreamExtensions.<>c__DisplayClass4.<ReadAsync>b__1(IAsyncResult ar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)<---

iisexpress.exe Error: 0 : SignalR exception thrown by Task: System.AggregateException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)
   at Microsoft.AspNet.SignalR.Infrastructure.StreamExtensions.<>c__DisplayClass4.<ReadAsync>b__1(IAsyncResult ar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
   --- End of inner exception stack trace ---
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)
   at Microsoft.AspNet.SignalR.Infrastructure.StreamExtensions.<>c__DisplayClass4.<ReadAsync>b__1(IAsyncResult ar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
   --- End of inner exception stack trace ---
---> (Inner Exception #0) System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.ConnectStream.EndRead(IAsyncResult asyncResult)
   at Microsoft.AspNet.SignalR.Infrastructure.StreamExtensions.<>c__DisplayClass4.<ReadAsync>b__1(IAsyncResult ar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)<---
<---

I don't understand why is this exception is being thrown, even though the performance for my service isn't tampered, I fear it might cause problems. How can I get rid of this problem?

Foi útil?

Solução

Calling Connection.Stop() will abort any pending HTTP request and that's by design. There's other way to cleanly kill the running http request.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top