2013-05-25 57 views
5

Tôi đã cố gắng để có được ứng dụng khách WPF của tôi để nhận được một tin nhắn SignalR được gửi bởi dịch vụ WCF. Tôi đã thử rất nhiều thứ và bây giờ đã sử dụng để hacking đi với hy vọng rằng một cái gì đó chỉ hoạt động. Tôi đã làm theo hướng dẫn và ví dụ trực tuyến, và tôi chỉ đơn giản là không thể có được phương pháp WPF OnSignalRMessage() của tôi để được gọi. Tôi sẽ làm gì sai ở đây?Tin nhắn SignalR không nhận được trên máy khách

trung tâm của tôi:

public class PrestoHub : Hub 
{ 
    public void Send(string message) 
    { 
     Clients.All.OnSignalRMessage(message); 
    } 
} 

lớp khởi động của tôi:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HubConfiguration { EnableCrossDomain = true }; 

     app.MapHubs("http://localhost:8084", config); 
    } 
} 

Phương pháp bắt đầu chủ SignalR của tôi (trong máy chủ dịch vụ WCF của tôi):

private void StartSignalRHost() 
    { 
     const string url = "http://localhost:8084"; 
     WebApplication.Start<Startup>(url); 
    } 

Mã để thực sự gửi một số tin nhắn:

GlobalHost.ConnectionManager.GetHubContext<PrestoHub>().Clients.All.OnSignalRMessage("snuh"); 
Console.WriteLine("Sent 'snuh' to all clients..."); 

My WPF phương pháp khách hàng:

private void InitializeSignalR() 
    { 
     var hubConnection = new Connection("http://localhost:8084"); 
     hubConnection.Start(); 
     hubConnection.Received += OnSignalRMessage; 
    } 

    private void OnSignalRMessage(string data) 
    { 
     MessageBox.Show(data); 
    } 

Trả lời

3

Trong khi tôi vẫn đang phải vật lộn để hiểu được làm thế nào và tại sao, tôi đã có thể để có được nó làm việc. 1 đến N. Taylor Mullen để chỉ cho tôi đi đúng hướng. Ngoài đề xuất của mình ở phía máy khách, tôi cũng phải thay đổi một số mã máy chủ, cụ thể là sử dụng một hub rỗng và một lớp Khởi động đơn giản.

trung tâm của tôi:

public class PrestoHub : Hub{} 

Lưu ý: Các trung tâm là trống rỗng, vì chúng tôi không gọi phương pháp bên trong nó. Như chúng ta sẽ thấy sau, chúng ta sẽ nhận được bối cảnh trung tâm và gửi tin nhắn tới các máy khách.

lớp khởi động của tôi:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapHubs(); 
    } 
} 

Đoạn mã trên có vẻ là những gì cố định vấn đề.Điều này cũng hoạt động:

var config = new HubConfiguration { EnableCrossDomain = true }; 
app.MapHubs(config); 

Nhưng ngay sau khi tôi chỉ định một URL, khách hàng của tôi không nhận được tin nhắn (đã cố gắng có và không có phần "SignalR"):

app.MapHubs("http://localhost:8084/SignalR", config); 

Phương pháp này bắt đầu chủ SignalR của tôi (trong máy chủ dịch vụ WCF của tôi):

private void StartSignalRHost() 
{ 
    const string url = "http://localhost:8084"; 
    WebApplication.Start<Startup>(url); 
} 

mã này để thực sự gửi một số thông điệp:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>(); 
hubContext.Clients.All.OnSignalRMessage("snuh"); 

My phương pháp khách hàng WPF:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => 
     { 
      MessageBox.Show(data); 
     }); 
    hubConnection.Start(); 
} 
+0

Lý do tại sao chỉ định một URL khiến ứng dụng của bạn không thành công: https://github.com/SignalR/SignalR/issues/962 –

+0

Vì vậy, đó là vì tôi đã chỉ định URL đầy đủ? Nếu tôi muốn thay đổi nó, tôi cần phải làm một cái gì đó như thế này? 'MapHubs (" ~/SignalR2 ")' –

1

Bạn đang tạo một PersistentConnection không phải là một kết nối trung tâm. Để nhận tin nhắn từ PrestoHub của bạn, trước tiên bạn cần kết nối với HubConnection và sau đó bạn cần xử lý sự kiện "OnSignalRMessage".

Vì vậy, mã khách hàng của bạn bây giờ sẽ như thế nào:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 

    // Bind the "OnSignalRMessage" to a function 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => { 
     MessageBox.Show(data); 
    }); 

    hubConnection.Start(); 
} 
+0

Trên thực tế, sử dụng 'HubConnection' là một trong những nỗ lực của tôi. Tôi vừa thử ví dụ mã của bạn và 'MessageBox.Show()' không bị tấn công. –

+0

Đảm bảo rằng MapHub của bạn đang bị tấn công và nếu nó được chuyển đến http: // localhost: 8084/signalr/hub trong trình duyệt web và xem bạn có nhận được tệp javascript hay không. –

+0

MapHub đang được truy cập nhưng trang đó sẽ không xuất hiện trong trình duyệt. Tôi vừa in ebook SignalR. Tôi sẽ đọc và thực hiện thêm một số khắc phục sự cố. Cảm ơn vì những lời khuyên. –

0

Nếu phương pháp của bạn ở phía máy chủ là không đồng bộ đảm bảo họ trở về một nhiệm vụ thay vì vô hiệu. Đó là bạn nên có

public async Task Method(){ } 

và không

public async void Method(){ } 
Các vấn đề liên quan