2016-12-19 10 views
0

SignalRハブクラスが数秒ごとにデータベースをチェックし、接続IDに基づいて接続されているクライアントを更新する、既存のWeb APIアプリケーションでSingalRを実装しました。私たちは、クライアントアプリケーションがハブインスタンスを作成し、接続が確立されます知っているように、私が直面してる数秒ごとにデータベース内のデータをチェックするためのSIgnalRの実装

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using Microsoft.AspNet.SignalR; 
using System.Threading.Tasks; 
using VHC.Core.Business.Managers.Old; 
using VHC.Core.Common.Requests; 
using VHC.Core.Business.Interfaces; 
using VHC.Core.ServiceProxy.ServiceProxies; 

namespace VHC.Core.WebAPI 
{ 
    public class NotifyHub : Hub 
    { 

     public static string ConnectionId { get; set; } 
     public string NotificationResult { get; set; } 

     //public NotifyHub() 
     //{ 
    //} 


     public void PushNotificationData(Int32 userId, Int16 userTypeId) 
     { 

      lock (this) 
      { 
       var request = new PushNotificationRequest 
       { 
        FilterProperty = new Common.Filters.FilterProperty { Offset = 0, RecordLimit = 0, OrderBy = "datechecked desc" }, 
        Filters = new List<Common.Filters.FilterObject> { new Common.Filters.FilterObject { LogicOperator = 0, ConditionOperator = 0, Function = 0, FieldName = "", FieldValue = "", FieldType = 0 } } 
       }; 
       INotificationManager inotifity = new NotificationManager(); 
       var taskTimer = Task.Run(async() => 
       { 
        while (true) 
        { 
         //var serviceProxy = new NotificationServiceProxy(); 
         // var NotificationResult = inotifity.PublishResultsAsync(request, userId, userTypeId);--check database 

         if (userId == 3134) 
         { 
          NotificationResult = "validated"; 
          //Sending the server time to all the connected clients on the client method SendServerTime() 
          Clients.Client(ConnectionId).NotificationToClient(NotificationResult); 
         } 
         else 
         { 
          NotificationResult = "not validated"; 

          //Sending the server time to all the connected clients on the client method SendServerTime() 
          Clients.Client(ConnectionId).NotificationToClient(NotificationResult); 
         } 

         //Delaying by 6 seconds. 
         await Task.Delay(6000); 
        } 
       }); 
      } 
     } 

     public override Task OnConnected() 
     { 
      ConnectionId = Context.ConnectionId; 

      return base.OnConnected(); 
     } 
    } 
} 

問題があり、 :

は、ここに私のハブクラスです。一度にクライアントアプリケーションを実行しているときに、問題は発生しませんでした。 2つ以上の並列アプリケーションでクライアントアプリケーションを実行しているときに、データが完全に混乱しているという問題が発生しています。

例:PushNotificationDataメソッドの場合、クライアントアプリケーションはuserIDを動的に渡します。上記のコードでは、userID ==3143のときにロジックを書いていますが、応答は「検証済み」、そうでなければ「検証されていません。

私は1つのブラウザでアプリケーションを実行している場合

を「検証」として、私は、応答ごとに6秒を取得していますが、私は並列2以上でアプリケーションを実行している場合は、私が取得しています応答は6秒ごとに「検証された」時には「検証されていない」時間となる。

私は何かが混乱していると思います。親切に私を助けてください。私はその希望を明確にしたい。

答えて

0

ハブライフサイクルはあなたがハブ内の任意の状態を保存し、当然の非同期サイクリング機能を呼び出すべきではありません"per request".

です。 次のようにコードを書き換えるようにしてください:

  • アプリ(app.MapSinglaR(近く)、またはこのようなもの)、起動中に分離サイクルを作成します。
  • スタティックの辞書またはリストなど、必要なものを作成し、アクティブなユーザーを格納するために使用します。
  • GlobalHost.ConnectionManager.GetHubContext<NotifyHub>()を使用して、非同期サイクル内のHubインスタンスを取得します。
関連する問題