9

私の ASP.NET MVC 4 Web アプリケーションは、頻繁に更新されるデータをクライアントに表示しています。データは外部ソース (サーバーにインストールされたアプリケーション) から発生し、SQL Server 2008 R2 によって処理されます。

現在、データ フローは非常に伝統的です。クライアントは ASP.NET からポーリングし、ASP.NET は SQL Server から順番にポーリングします。

ポーリングを回避するために (そして、Web アプリケーションのユーザー間のリアルタイムの対話が必要になったため)、signalRクライアントへのデータのブロードキャストに使用するプッシュへのアプローチを変更しています。これにより、ユーザー エクスペリエンスのスムーズさが向上し、クライアントと ASP.NET サーバー間のポーリングのオーバーヘッドも削減されます。

問題は、SSRV と ASP.NET の間のフローを逆にすることです。最も効率的な方法でSSRV から ASP.NET にデータをプッシュしたいと考えています。

SSRV は、一部の外部データをインポートするために高価なクエリを実行しています。データが処理されると、ブロードキャストを介してインターネット経由で共有する準備も整います。

私の現在の貧乏人のアプローチ: POST Http 要求を Web アプリケーション (ローカルホスト上) に発行して、データを送信します (そのために CLR 関数を使用しています)。

データが処理されたら、他のアクティビティに影響を与えないように、データを準備してパックしHttpWebRequest、Service Broker のキューに入れます。これで完了です。

データのクエリを強制するように書き留めましSqlDependencyた-大きな利点ではありません(ローカルホストのHTTPリクエストとSQL Serverで実行されるクエリをトレードオフします)

同時に、これを行うためのよりきちんとした方法があるべきだとも感じています。

助言がありますか?

4

2 に答える 2

7

さて、SignalR.Client.NET.35ライブラリについて少し遅れて気づきました。

執筆時点では、NuGetにパッケージ化されていないため、コードをGitHub SignalRプロジェクトサイトからダウンロードして、プロジェクトとしてソリューションに追加する必要があります( SignalR.Client.NETSignalR.Client.NET35の両方が必要です)。

これが将来誰かを助けることができる場合の最終的な解決策です:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Xml;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.Net;
using System.IO;
using System.Xml.XPath;
using SignalR.Client.Hubs;

    internal static HubConnection connectionT = null;
    internal static IHubProxy msgHubT = null;

    /// <summary>
    /// allows SSRV to send a message to the Web Socket hub
    /// </summary>
    /// <param name="URL">URL of the Hub</param>
    /// <param name="hubName">Name of the message Hub to be used for broadcasting.</param>
    /// <param name="hubMethod">Hub method to be used for broadcasting.</param>
    /// <param name="message">Message to be broadcasted.</param>
    [SqlFunction()]
    public static void ut_sendMsgToHub(string URL, string hubName, string hubMethod, string message)
    { 
      try
        {
        if (connectionT == null)
        {
            connectionT = new HubConnection(URL.Trim()); // "http://localhost:56844/M2Hub"
        }
        if (msgHubT == null)
        {
            msgHubT = connectionT.CreateProxy(hubName.Trim());//"M2data"
        }

            if (!(connectionT.State == SignalR.Client.ConnectionState.Connected 
                || connectionT.State == SignalR.Client.ConnectionState.Reconnecting
                 || connectionT.State == SignalR.Client.ConnectionState.Connecting))
                connectionT.Start().Wait();
            msgHubT.Invoke(hubMethod.Trim(), message.Trim()).Wait();//"Send"
        }
        catch (Exception exc)
        {
            SqlContext.Pipe.Send("ut_sendMsgToHub error: " + exc.Message + Environment.NewLine);
        }
    }

注意すべき重要事項:コンパイルされたSQL SERVER 2008R2 CLRライブラリと一緒に、次のdllを同じフォルダーに配置する必要があります。

  • Newtonsoft.Json
  • SignalR.Client.Net35は明らかに
  • SMdiagnostics
  • System.Runtime.Serialization
  • 正しいバージョンのSystem.ServiceModel(互換性がない場合は、C:\ Windows \ assemblyのGACに記載されているバージョンを参照してください)。
  • System.Threading

最後にSQLSERVERで:

CREATE ASSEMBLY CLR_Bridge from 'C:\PathToLibraries\Library_CLR.dll' 
WITH PERMISSION_SET = UNSAFE --UNSAFE required
CREATE PROCEDURE ut_sendMsgToHub 
@url nchar(125) ,
@hubName nchar(75),
@hubMethod NCHAR(75),
@message NVARCHAR(MAX)
AS
EXTERNAL NAME CLR_Bridge.[LibraryNamespace.CLR_Bridge].ut_sendMsgToHub 

ut_sendMsgToHubを呼び出すには、サービスブローカーを使用して、関数の実行に関する問題がデータを処理するストアドプロシージャから切り離されていることを確認します。

于 2012-08-29T15:35:55.913 に答える
1

SignalRを見たことがありますか? これを使用して、データを UI に非同期的にプッシュできます (ただし、これは真のプッシュではありません)。これは特定の状況では受け入れられない場合がありますが、確認することをお勧めします。必要なものかもしれません。それが役立つことを願っています。

于 2012-06-14T18:57:51.343 に答える