2013-05-25 33 views
5

WPF istemcisi uygulamasının WCF servisi tarafından gönderilen bir SignalR mesajı almasını sağlamaya çalışıyorum. Birçok şey denedim ve şimdi bir şeyin işe yaradığı umuduyla hack yapmaya başvurdum. Çevrimiçi dersleri ve örnekleri takip ettim ve WPF OnSignalRMessage() yönteminin çağrılmasını sağlayamadım. Burada nerede yanlış gidiyorum?İstemcide SinyalR iletisi alınmıyor

Benim göbek:

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

Benim başlangıç ​​sınıfı:

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

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

(benim WCF hizmeti konak içinde) benim SignalR ana başlatır yöntemi:

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

kodu Bazı mesaj göndermek için:

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

Benim WPF istemci yöntemleri:

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

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

cevap

3

Hala nasıl ve neden anlamak mücadele ediyorum, ben bu çalışma başardı: gibi

Yani istemci kod artık görünecektir. Taylor Mullen bana doğru yönde işaret ettiği için +1'e. İstemci tarafında önerisine ek olarak, boş bir hub ve basitleştirilmiş bir Başlangıç ​​sınıfı kullanarak, bazı sunucu kodlarını da değiştirmem gerekiyordu.

Benim göbek:

public class PrestoHub : Hub{} 

Not: bunun içinde yöntemler demeyeceğiz, çünkü göbek boştur. Daha sonra göreceğimiz gibi, hub bağlamını alır ve müşterilere mesaj göndeririz.

Benim başlangıç ​​sınıfı:

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

Yukarıdaki kod sorunu sabit neyi gibi görünüyor.Bu aynı zamanda çalışır:

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

Ama en kısa sürede bir URL belirtin olarak, iletileri almaz müvekkilim ("SignalR" bölümü ile ve olmadan çalıştı):

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

yöntem ki (benim WCF hizmeti konak içinde) benim SignalR ana başlar:

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

kod aslında bazı mesaj göndermek için:

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

My WPF istemci yöntemi: sunucu tarafında metodlar asenkron ise

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

Bir URL belirtme neden uygulamanızın başarısız olmasına neden oldu: https://github.com/SignalR/SignalR/issues/962 –

+0

Bu yüzden tam URL'yi belirtiyordum? Eğer değiştirmek istersem, böyle bir şey yapmalı mıyım? 'MapHubs ("~/SignalR2") ' –

1

Bir PersistentConnection hub bağlantısı yaratıyorsun. PrestoHub'unuzdan mesaj almak için önce bir HubConnection ile bağlantı kurmanız ve ardından "OnSignalRMessage" olayını işlemeniz gerekir.

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

public async Task Method(){ } 

değil olması gereken olduğunu 'HubConnection' benim girişimleri biriydi. Kod örneğini denedim ve 'MessageBox.Show()' vurulmuyor. –

+0

MapHub'larınızın vurulduğundan ve bir web tarayıcısında http: // localhost: 8084/signalr/hub'lara gittiğinden ve bir javascript dosyası alıp almadığınızı kontrol edin. –

+0

MapHubs vuruluyor, ancak bu sayfa tarayıcıda görüntülenmiyor. SignalR ebook'u yazdırdım. Bunu okuyacağım ve daha fazla sorun giderme işlemi yapacağım. İpuçları için teşekkürler. –

0

onlar boşluk yerine bir görevi iade emin olun. Yani kullanarak Aslında

public async void Method(){ } 
İlgili konular