1

我有一个 WPF 应用程序,它使用 SignalR 来实现发布/订阅模型。当我使用 WPF 客户端连接到上述应用程序时,发布和回调工作成功。

然后我创建了一个 ASP.Net 客户端。我使用 SignalR 的跨域属性连接到上面的 WPF 应用程序。

它可以连接到应用程序并成功调用集线器中提供的方法。但是,当 WPF 应用程序调用 ASP.Net 客户端中的方法时,似乎该调用无法到达客户端浏览器

(在火狐浏览器中,长轮询不返回,即使我在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);
    }
}

上面的代码有问题吗?

4

1 回答 1

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);
    }

    // ...
 }
于 2013-02-01T23:35:45.930 回答