私は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アプリにメッセージが表示されません。