簡體   English   中英

無法在silverlight客戶端打開信號器連接

[英]Cannot open signalr connection in silverlight client

我正在嘗試基於這個博客在Silverlight中實現SignalR: SignalR和Silverlight

當我嘗試.Invoke()時,我收到一個運行時錯誤“System.InvalidOperationException:必須先調用Start方法,然后才能發送數據。在Microsoft.AspNet的Microsoft.AspNet.SignalR.Client.Connection.Send(字符串數據)中.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()上拋出異常;

如何正確連接集線器並發送消息?

HubConnection.Start是異步的。 您無法在Invoke之前Invoke Start ,因為您的HubConnection可能仍處於Connecting狀態。

您需要等待從Start返回的Task完成,然后才能調用IHubProxy.Invoke 您可以使用await (如果您沒有運行.NET 4.5,則使用Task.ContinueWith )以確保在啟用buttonAdd之前Start完成。

您還可以在工廠方法中異步創建AddProductView對象。 您可以在靜態Task<AddProductView> CreateAddProductView()方法中執行此操作,而不是在構造函數中調用HubConnection.Start

或者,如果您不關心AddProductView的創建是異步的,您只需同步調用Start

_conn.Start().Wait();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM