パブリッシュ/サブスクライブ モデルを実現するために SignalR を使用する WPF アプリケーションがあります。WPF クライアントを使用して上記のアプリケーションに接続すると、発行とコールバックが正常に機能しました。
次に、ASP.Net クライアントを作成しました。上記の WPF アプリケーションに接続するには、SignalR のクロス ドメイン プロパティを使用します。
アプリケーションに接続し、ハブで提供されているメソッドを正常に呼び出すことができました。ただし、WPF アプリケーションが ASP.Net クライアントでメソッドを呼び出すと、その呼び出しがクライアント ブラウザーに到達できないようです。
(Firefox で見ると、ロングポーリングが返ってこない。javascript コールバック関数にブレークポイントを設定してもブレークポイントに到達できず、ブラウザに何も表示されない)。
次のスクリプトをhtmlに含めました
<script src="@Url.Content("~/Scripts/jquery-1.6.4.min.js")" type="text/javascript</script>
<script src="/Scripts/jquery.signalR-1.0.0-rc2.min.js" type="text/javascript"></script>
<script src="http://localhost:9999/signalr/hubs" type="text/javascript"></script>
以下は私が使用したjavascriptです。
jQuery.support.cors = true;
myHub = $.connection.subscriberHub;
myHub.client.addMessage = function (msg, time) {
$("#message").prepend("<div>" + time + " " + msg + "</div>");
};
$.connection.hub.url = 'http://localhost:9999/signalr';
$.connection.hub.start();
以下は、WPF アプリケーションのサーバー コードです。
public partial class App : Application
{
private IDisposable app;
private void Application_Startup(object sender, StartupEventArgs e)
{
string url = "http://localhost:9999";
app = WebApplication.Start<Startup>(url);
}
private void Application_Exit(object sender, ExitEventArgs e)
{
if (app != null)
{
app.Dispose();
}
}
}
class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapHubs();
}
}
そして、WPF アプリケーションがボタンをクリックしたときにメッセージを送信します。
private void btn_sendMsg_Click(object sender, RoutedEventArgs e)
{
var context = GlobalHost.ConnectionManager.GetHubContext<SubscriberHub>();
DateTime sentTime = DateTime.Now;
context.Clients.Group("subscriber").addMessage(tb_message.Text, sentTime);
MessageList.Insert(0,string.Format("{0:yyyy-MM-dd HH:mm:ss} {1}", sentTime, tb_message.Text));
}
以下は、私が定義したハブです。
public class SubscriberHub : Hub
{
string group = "subscriber";
public Task Subscribe()
{
return Groups.Add(Context.ConnectionId, group);
}
public Task Unsubscribe()
{
return Groups.Remove(Context.ConnectionId, group);
}
}
上記のコードに問題はありますか?