2016-09-23 3 views
0

Мне нужно провести некоторое тестирование с помощью SignalR, поэтому у меня есть два консольных приложения - сначала они служат в качестве концентратора SignalR (сервер) и второго клиента SignalR. Мне нужно перенести списки пользовательских объектов, а не некоторые примитивные данные, такие как строки или целые числа. Я не хочу использовать WCF из-за его сложности.Передача IList (Of T) с использованием SignalR в настольном приложении

Hub:

Imports Microsoft.AspNet.SignalR 
Imports Microsoft.AspNet.SignalR.Hubs 
Imports DataContract 
<HubName("Repository")> 
Public Class RepositoryHub 
    Inherits Hub 
    Public Function SelectTasks() As IList(Of Task) 
    Dim tasks As New List(Of Task) 
    tasks.Add(New Task With {.Id = 1, .Code = "A", .Assignment = "Assignment A"}) 
    tasks.Add(New Task With {.Id = 2, .Code = "B", .Assignment = "Assignment B"}) 
    tasks.Add(New Task With {.Id = 3, .Code = "C", .Assignment = "Assignment C"}) 
    Return tasks 
    End Function 
    Public Overrides Function OnConnected() As Threading.Tasks.Task 
    Console.WriteLine(Context.ConnectionId) 
    Return MyBase.OnConnected() 
    End Function 
End Class 

Public Class Task 
    Public Property Id As Integer 
    Public Property Code As String 
    Public Property Assignment As String 
End Class 

Сервер:

Imports Microsoft.Owin.Hosting 
Module ServerModule 
    Sub Main() 
    Using WebApp.Start(Of OwinConfiguration)("http://localhost:8080") 
     Console.ReadLine() 
    End Using 
    End Sub 
End Module 

Public Class OwinConfiguration 
    Public Sub Configuration(app As IAppBuilder) 
    app.UseCors(CorsOptions.AllowAll) 
    app.MapSignalR() 
    End Sub 
End Class 

Клиент:

Imports Microsoft.AspNet.SignalR.Client 
Imports DataContract 
Module ClientModule 
    Sub Main() 
    Dim repositoryHub As IHubProxy 
    Dim connection As New HubConnection("http://localhost:8080") 
    repositoryHub = connection.CreateHubProxy("Repository") 
    repositoryHub.On(Of IList(Of Task))("SelectTasks", Sub(t) 
                 Console.WriteLine(t.Count) 
                 End Sub) 
    connection.Start().Wait() 
    repositoryHub.Invoke(Of IList(Of Task))("SelectTasks").Wait() 
    Console.ReadLine() 
    End Sub 
End Module 

Breakpoint всегда достигается в методе SelectTasks, но не в методе анонимной Sub (т) в клиенте , где выполняется обработка данных, полученных от сервера.

ответ

0

Это было непонимание в использовании SignalR. Клиент должен быть таким:

Imports Microsoft.AspNet.SignalR.Client 
Imports DataContract 
Module ClientModule 
    Sub Main() 
    Dim repositoryHub As IHubProxy 
    Dim connection As New HubConnection("http://localhost:8080") 
    repositoryHub = connection.CreateHubProxy("Repository") 
    connection.Start().Wait() 
    Dim tasks = repositoryHub.Invoke(Of IList(Of Task))("SelectTasks") 
    tasks.Wait() 
    Console.WriteLine(tasks.Result.Count) 
    Console.ReadLine() 
    End Sub 
End Module