自主主机SignalR与跨域ASP.Net客户端回调失败

时间:2013-01-30 06:05:42

标签: asp.net signalr

我有一个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);
    }
}

上面的代码有问题吗?

1 个答案:

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

    // ...
 }