1

定期的にデータを公開したい Windows サービスがあります。.NETHubConnectionオブジェクトを使用して、SignalR ハブへのプロキシを作成し、それを介してメッセージを送信できることはわかっていますが、Web アプリは IIS Web ファームでホストされているため、少しハッキングされる可能性があります。Web ファーム ハブは、SQL Server ベースのSqlScaleoutConfigurationバックプレーンを使用して接続されています。私が本当にやりたいことは、次のようなことです。

var config = new SqlScaleoutConfiguration(sqlConnString);
GlobalHost.DependencyResolver.UseSqlServer(sqlConnString); //Redundent??

var messageBus = new SqlMessageBus(GlobalHost.DependencyResolver, config);
var message = new Message("DataHub", "RefreshData", payload);
messageBus.Publish(message);

明らかにこれは機能しません。SignalR メッセージ バスと直接対話する方法に関するサンプル コード/ドキュメントは大歓迎です。ありがとう!!

4

1 に答える 1

3

テストしていませんが、このようなものはSQLスケールアウトバスで動作するはずです。

RabbitMQ をバックプレーンとして使用するスケールアウト バスであるSignalR.RabbitMQ プロジェクトから。

基本的に、コンソール プロジェクトでメッセージ バスを構成します。ブロードキャスト先のハブへの参照を取得します。その後、メッセージを送信してください...

        var factory = new ConnectionFactory
        {
            UserName = "guest",
            Password = "guest"
        };

        var exchangeName = "SignalR.RabbitMQ-Example";

        var configuration = new RabbitMqScaleoutConfiguration(factory, exchangeName);
        GlobalHost.DependencyResolver.UseRabbitMq(configuration); ;

        var hubContext = GlobalHost.ConnectionManager.GetHubContext<Chat>();

        Task.Factory.StartNew(
            () =>
                {
                    int i = 0;
                    while (true)
                    {
                        hubContext.Clients.All.onConsoleMessage(i++);
                        System.Console.WriteLine(i);
                        Thread.Sleep(100);
                    }
                }
            );

マークの答えは正しいが >>>>>>>>>>>>>>>>>>>>>

これを SQL Server スケールアウトで機能させるために私がしなければならなかったことは次のとおりです。

更新サービス:

  • メッセージをクライアントに送信するハブ クラスの正確なレプリカを作成 (または単に参照) します。ハブ クラスには、メッセージが通過できるようにするプレースホルダー メソッドを含める必要があります。

        public class DataHub : Hub {
            // other hub methods here ...
    
            public void RefreshData(SomeAppropriateType messageData)
            {
                // Placeholder method for tunneling data refreshes through the SQL Server scaleout backplane          
            }
        }
    
  • SQL Server データベースを登録します。

        var signalrDbConnectionString = ConfigurationManager.ConnectionStrings["signalr"].ConnectionString;
        GlobalHost.DependencyResolver.UseSqlServer(signalrDbConnectionString);
        routes.MapHubs();
    
  • ハブ プロキシ クラスを介してすべてのクライアントにメッセージをブロードキャストします。

        var messageData = // instantiate the parameter value of the RefreshData method in the hub class
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<DataHub>();
        Task.Factory.StartNew(() => hubContext.Clients.All.RefreshData(messageData)).Wait();
    

Webサイト:

  • 更新サービスの同じ最初のステップ。

  • 前と同じように SQL Server データベースを登録しますが、Web アプリのグローバル セットアップのどこかに登録します。

  • メッセージを受信するには、次の行に沿って適切なページの JavaScript を記述します。

        function listenForUpdates() {
            if (updater === undefined) {
                updater = $.connection.dataHub;
            }
    
            if (updater !== undefined) {
                // Declare a function on the hub so the server can invoke it
                updater.client.refreshData = function (value) {
                    // for debugging: console.log(value);
    
                    // update the appropriate page elements with the new data
                };
            }
        }
    
于 2013-08-07T21:24:39.530 に答える