【问题标题】:Cannot open signalr connection in silverlight client无法在 silverlight 客户端中打开信号器连接
【发布时间】:2026-02-13 17:40:01
【问题描述】:

我正在尝试基于此博客在 Silverlight 中实现 SignalR:SignalR and Silverlight

当我尝试 .Invoke() 时,出现运行时错误“System.InvalidOperationException:必须先调用 Start 方法才能发送数据。在 Microsoft.AspNet.SignalR.Client.Connection.Send(String data) 处Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[T](String method, Object[] args)..."

我的连接上有 _conn.Start()。如果我在调用之前再次尝试 Start() 它,它会引发异常。这是我的代码:

    private IHubProxy _hub;
    private HubConnection _conn;

    public AddProductView()
    {
        InitializeComponent();
        var url = Application.Current.Host.Source.GetComponents(UriComponents.Scheme | UriComponents.HostAndPort,
                                                                UriFormat.Unescaped);
        _conn = new HubConnection(url);
        _hub = _conn.CreateHubProxy("SilverlightPrism.Mvc.Services.ProductHub");
        _hub.On<string>("NewMessage", message => Deployment.Current.Dispatcher.BeginInvoke(() => DoAddItem(message) ));
        _conn.Start();
    }

    private void DoAddItem(string item)
    {
        var product = DeserializeToProduct(item);
        ProductData.Products.Add(product);
    }

    private void buttonAdd_Click(object sender, RoutedEventArgs e)
    {
        Random random = new Random();
        var id = Guid.NewGuid();
        var product = new Product
            {
                Price = random.Next(1000,100000),
                ProdId = id,
                ProdName = "New prod."
            };
        var jsonMessage = SerializeToJsonString(product);
        _hub.Invoke("SendMessage", jsonMessage);
    }

它在 _hub.Invoke() 上抛出异常;

如何正确连接集线器并发送消息?

【问题讨论】:

    标签: c# silverlight signalr


    【解决方案1】:

    HubConnection.Start 是异步的。您不能在Invoke 之前调用Start,因为您的HubConnection 可能仍处于Connecting 状态。

    您需要等待从Start 返回的Task 完成,然后才能调用IHubProxy.Invoke。您可以使用await(或Task.ContinueWith,如果您没有运行.NET 4.5)来确保Start在启用buttonAdd之前完成。

    您还可以在工厂方法中异步创建 AddProductView 对象。您可以在静态 Task&lt;AddProductView&gt; CreateAddProductView() 方法中调用,而不是在构造函数中调用 HubConnection.Start

    或者,如果您不关心 AddProductView 的创建是异步的,您可以同步调用 Start

    _conn.Start().Wait();
    

    【讨论】:

    • 谢谢,这让我看到了一个我认为被吞没的错误,找不到服务器。一旦我修复了网址,我就应该开始营业了。