我有一个WPF应用程序,它使用SignalR来实现发布/订阅模型。 当我使用WPF客户端连接到上面的应用程序时,发布和回调工作成功。
然后我创建了一个ASP.Net客户端。我使用SignalR的跨域属性连接到上面的WPF应用程序。
它可以连接到应用程序并成功调用集线器中提供的方法。 但是,当WPF应用程序在ASP.Net客户端中调用该方法时,似乎无法将该调用传递到客户端浏览器
(在Firefox中查看,长轮询不返回;即使我在javascript回调函数中设置了断点,也无法达到断点,并且没有任何内容可以显示在broswer中。)
我在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);
}
}
上面的代码有问题吗?
答案 0 :(得分:0)
您是否需要让JavaScript客户端调用Subscribe
?
$.connection.hub.start().done(function () {
myHub.server.subscribe();
});
或者您可以修改SubscriberHub:
public class SubscriberHub : Hub
{
string group = "subscriber";
public override Task OnConnected()
{
return Groups.Add(Context.ConnectionId, group);
}
// ...
}