2014-07-25 21 views
10

Tôi có một Ứng dụng web ASP.NET với một trang HTML đơn giản và một số JavaScript để giao tiếp qua SignalR. Điều đó hoạt động tốt. Bây giờ tôi đang cố gắng để gọi một phương thức trên Hub từ một dự án khác (trong cùng một giải pháp) và bằng cách sử dụng .NET Signalr Khách hàng Api:SignalR 2.1.0: Kết nối chưa được thiết lập

 var connection = new HubConnection("http://localhost:32986/"); 
     var hub = connection.CreateHubProxy("MessageHub"); 
     connection.Start(); 
     hub.Invoke("SendMessage", "", ""); 

Dòng cuối cùng gây InvalidOperationException: The connection has not been established. Nhưng tôi có thể kết nối đến trung tâm từ mã JavaScript của tôi.

Tôi làm cách nào để kết nối với Hub bằng cách sử dụng mã C#?

CẬP NHẬT

Khoảnh khắc sau khi viết bài này, tôi cố gắng thêm .Wait() và nó làm việc! Vì vậy, đây sẽ làm:

 var connection = new HubConnection("http://localhost:32986/"); 
     var hub = connection.CreateHubProxy("MessageHub"); 
     connection.Start().Wait(); 
     hub.Invoke("SendMessage", "", ""); 

Trả lời

12

HubConnection.Start trả về một Task mà cần phải hoàn thành trước khi bạn có thể gọi một phương pháp.

Hai cách để làm điều này là sử dụng chờ đợi nếu bạn đang ở trong một phương pháp async, hoặc sử dụng Task.Wait() nếu bạn đang ở trong một phương pháp phi async:

public async Task StartConnection() 
{ 
    var connection = new HubConnection("http://localhost:32986/"); 
    var hub = connection.CreateHubProxy("MessageHub"); 
    await connection.Start(); 
    await hub.Invoke("SendMessage", "", ""); 
    // ... 
} 

// or 

public void StartConnection() 
{ 
    var connection = new HubConnection("http://localhost:32986/"); 
    var hub = connection.CreateHubProxy("MessageHub"); 
    connection.Start().Wait(); 
    hub.Invoke("SendMessage", "", "").Wait(); 
    // ... 
} 

Các "Làm thế nào để thiết lập kết nối "phần của ASP.NET SignalR Hubs API Guide for the .NET client. đi vào chi tiết hơn.

+1

Tùy chọn thứ ba: 'ContinueWith'. Về cơ bản, đây là cách nó được thực hiện ở phía máy khách, vì vậy nó bổ sung thêm một chút nhất quán giữa JS và C# Usages. – Corey

Các vấn đề liên quan