2

私はn層アプリケーションを持っています。これには、すべてのビジネスロジックを公開するWCFサービスがあり、Windowsサービスとしてホストされ、クライアントとしてMVCアプリケーションがあり、サービスを消費します。

そこにあるほとんどの例は、MVCアプリケーション内のSignalRを示しています。私はハブを次のような別のDLLに抽出しようとしました:

Hub.dll

public class Chat : Hub
{

    public void Send(string message)
    {
        Clients.All.addMessage(message);
    }
}

また、Hub.dllを参照として追加した後でも、MVC cshtmlからSend()を呼び出そうとしても機能しません。

これは私のcshtmlファイルのjavascriptです:

<script type="text/javascript">
    $(function() {
        // Proxy created on the fly          
        var chat = $.connection.chat;

        // Declare a function on the chat hub so the server can invoke it          
        chat.client.addMessage = function(message) {
            $('#messages').append('<li>' + message + '</li>');
        };

        // Start the connection
        $.connection.hub.start().done(function() {
            $("#broadcast").click(function() {
                // Call the chat method on the server
                chat.server.send($('#msg').val());
            });
        });
    });
</script>

上記のコードは非常に基本的な例ですが、私が達成したいことの例は、進行状況の報告が私のビジネスレイヤーによって行われることを除いて、そこにあるSignalRプログレスバーのチュートリアルに似ています。

さらに詳しく説明すると、次のようなことをしたいと思います。

1)MVCクライアントは、ホストされているWCFサービスを介してPerformLongRunningTaskA()を呼び出します。

2)WCFサービスがビジネスレイヤーのメソッドを呼び出す

3)ビジネスレイヤーがPerformLongRunningTaskA()を開始します

4)ビジネスレイヤーレポートは、進行状況をMVCクライアントに10%.. 20%..などで100%まで戻します(SignalRを使用しますか?)

これは私のプロジェクト構造が大まかに次のようになっています:プレゼンテーション-MVCアプリサービスレイヤー-WCFサービス(Windowsサービスでホストされている)ビジネスレイヤー-すべてのビジネスロジックデータレイヤー-Entityframework

編集:

上記が機能するようになりました。それは私の側のJavaScriptエラーでした。

別のコンソールアプリを作成して、ビジネスDLLをシミュレートし、Signalをトリガーして次のようなイベントをブロードキャストします。

class Program
{
    static void Main(string[] args)
    {
      Say("HEY");
    }
    public static void Say(string message)
    {
        var context = GlobalHost.ConnectionManager.GetHubContext<Chat>();
        context.Clients.All.say(message);
    }
}

コンソールプロジェクトへの参照としてHub.dllを追加しましたが、上記は機能しません。エラーメッセージはありません、何もありません。正常に動作しますが、MVCアプリにメッセージが表示されません。

4

1 に答える 1

5

メッセージをブロードキャストするふりをする場合、「サービス コンテキスト」にいる必要があります。つまり、ホストされているハブ コンテキストにアクセスする必要があるということです。

コンソール アプリからブロードキャストする必要がある場合は、それを可能にするメソッドをハブに作成し、コンソール アプリケーションをメインの SignalR サーバーのクライアントにすることができます。.net コンソール SignalR クライアントの作成方法の詳細: SignalR クライアント ハブ

コンソール アプリで "ホストされたコンテキスト" が必要な場合は、SelfHost SignalR SelfHostを試してください。

乾杯、

于 2013-04-04T06:35:00.143 に答える