2013-02-14 25 views
0

我有一个WCF Web服务中的函数,每次发生事件条目时都负责通过SignalR发送通知,并检查与Evento条目相关的群集是否有三个或更多如果是,则发送另一个通知。SignalR WebRequest正在中止

功能如下:

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(); 
     } 
    } 

我没有问题,发送通知,但会抛出异常eveytime有在最后一小时3名或更多的条目。

这是输出我得到异常:

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)<--- 
<--- 

我不明白这是为什么异常被抛出,即使我的服务性能没有被篡改,我担心它可能造成问题。我怎样才能摆脱这个问题?

回答

1

调用Connection.Stop()将中止任何挂起的HTTP请求,这是设计。还有其他方法可以干净地杀死正在运行的http请求。

+0

所以我应该只打一个电话给Connection.Disconnect()?由于我的方法是静态的,完成连接的最佳方法是什么? – 2013-02-14 16:54:29

+0

只需呼叫停止并让它中止连接。 – davidfowl 2013-02-15 07:06:39

+0

好的,谢谢你的回答。 – 2013-02-15 17:32:03