0

WCF Webサービスに、Eventoエントリが作成されるたびにSignalRを介して通知を送信する機能があります。また、Eventoエントリに関連するクラスターに過去1時間に3つ以上のエントリがあったかどうかを確認します。 、その後、別の通知が送信されます。

関数は次のようになります。

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

通知の送信に問題はありませんが、過去1時間に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)<---
<---

サービスのパフォーマンスが改ざんされていなくても、なぜこの例外がスローされるのかわかりませんが、問題が発生する可能性があります。どうすればこの問題を取り除くことができますか?

4

1 に答える 1

1

Connection.Stop() を呼び出すと、保留中の HTTP 要求が中止されます。これは設計によるものです。実行中の http リクエストをきれいに強制終了する方法は他にもあります。

于 2013-02-14T08:05:20.193 に答える