2015-02-01 3 views
0

Я пытаюсь реализовать некоторые вызовы SignalR для своего приложения WP 8.1, но у меня есть некоторые проблемы с методом On. Я могу подключиться к серверу, и я могу отправить данные на сервер через signalr с помощью метода Invoke. И я могу получить данные с сервера с помощью следующей команды:
Как я могу подписаться на событие SignalR On?

proxy.Subscribe("newTransaction").Received += newTransactionMethod; 
async void newTransactionMethod(IList<Newtonsoft.Json.Linq.JToken> obj) 
{ 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => { UpdateOutput2(obj[0]); }); 
} 

void UpdateOutput2(dynamic data) 
{ 
    if (data != null) 
    { 
     NewTransaction nt = JsonConvert.DeserializeObject<NewTransaction>(data.ToString()); 
     Output2.Text = "From: " + nt.fromName + " , To: " + nt.toName + " , Amount: " + nt.amount; 
    } 
} 

Но я хотел бы использовать метод On, а не подписаться, потому что рекомендуется и проще в использовании. Моя проблема в том, что когда я пытаюсь использовать метод On, он работает неправильно: я не получаю никаких данных с сервера. Вероятно, я не смогу его использовать.
Что я пробовал:

proxy.On<string>("newTransaction", data => 
{ 
    Output2.Text = data; 
}); 

Хорошо, я не использую JsonConvert в этом, но я могу сериализовать его после того, как я получаю данные.
Может ли кто-нибудь помочь мне решить мою проблему?

EDIT:
Вот полный код, возможно, он поможет разобраться с проблемой.

public sealed partial class SignalrPage : Page 
{ 
    HubConnection connection; 
    IHubProxy proxy; 

    public SignalrPage() 
    { 
     this.InitializeComponent(); 

     this.NavigationCacheMode = NavigationCacheMode.Required; 

     SignalR1(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
    } 

    public async void SignalR1() 
    { 
     try 
     { 
      connection = new HubConnection("https://***"); 
      proxy = connection.CreateHubProxy("***Hub"); 

      await connection.Start(new WebSocketTransport()); 

      if (connection.State == Microsoft.AspNet.SignalR.Client.ConnectionState.Connected) 
       Output.Text = "Connected"; 

      var s = await proxy.Invoke<LoginData>("RegisterDevice", new LoginData() 
      { 
       UserName = "***", 
       Password = "***", 
       DeviceId = "***", 
       DeviceType = 10 
      }); 
      Output.Text = s.DeviceRegistered.ToString(); 

      //If I uncomment the next line and comment the proxy.On method is it working. But in this case not. 
      //proxy.Subscribe("newTransaction").Received += newTransactionMethod; 

      proxy.On<string>("newTransaction", data => 
      { 
       Output2.Text = data; 
      }); 

      Output3.Text = "It should be subscribed to newTransaction"; 
     } 
     catch (Exception e) 
     { 
      Output.Text = e.ToString(); 
     } 
    } 

    async void newTransactionMethod(IList<Newtonsoft.Json.Linq.JToken> obj) 
    { 
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => { UpdateOutput2(obj[0]); }); 
    } 

    void UpdateOutput2(dynamic data) 
    { 
     if (data != null) 
     { 
      NewTransaction nt = JsonConvert.DeserializeObject<NewTransaction>(data.ToString()); 
      Output2.Text = "From: " + nt.fromName + " , To: " + nt.toName + " , Amount: " + nt.amount; 
     } 
    } 

} 
+0

Is On вызывается, но данные пустые, или On вообще не вызывается? –

+0

К сожалению, не вызывается. – Speederer

ответ

0
startHub: function() { 
    $.connection.hub.url = self.hubUrl; // ie. "https://rasxps:8082/signalR"; 

    // capture the hub for easier access 
    var hub = $.connection.queueMonitorServiceHub; 

    // This means the <script> proxy failed - have to reload 
    if (hub == null) { 
     self.viewModel.connectionStatus("Offline");     
     toastr.error("Couldn't connect to server. Please refresh the page."); 
     return; 
    } 

    // Connection Events 
    hub.connection.error(function (error) {     
     if (error) 
      toastr.error("An error occurred: " + error.message); 
     self.hub = null; 
    }); 
    hub.connection.disconnected(function (error) {     
     self.viewModel.connectionStatus("Connection lost"); 
     toastr.error("Connection lost. " + error);     

     // IMPORTANT: continuously try re-starting connection 
     setTimeout(function() {      
      $.connection.hub.start();      
     }, 2000); 
    });    

    // map client callbacks 
    hub.client.writeMessage = self.writeMessage; 
    hub.client.writeQueueMessage = self.writeQueueMessage;    
    hub.client.statusMessage = self.statusMessage; 
    … 

    // start the hub and handle after start actions 
    $.connection.hub 
     .start() 
     .done(function() { 
      hub.connection.stateChanged(function (change) { 
       if (change.newState === $.signalR.connectionState.reconnecting) 
        self.viewModel.connectionStatus("Connection lost"); 
       else if (change.newState === $.signalR.connectionState.connected) { 
        self.viewModel.connectionStatus("Online"); 

        // IMPORTANT: On reconnection you have to reset the hub 
        self.hub = $.connection.queueMonitorServiceHub; 
       } 
       else if (change.newState === $.signalR.connectionState.disconnected) 
        self.viewModel.connectionStatus("Disconnected"); 
      })  
     .error(function (error) { 
      if (!error) 
       error = "Disconnected"; 
      toastr.error(error.message); 
     }) 
     .disconnected(function (msg) { 
      toastr.warning("Disconnected: " + msg); 
     }); 

     self.viewModel.connectionStatus("Online");     

     // get initial status from the server (RPC style method) 
     self.getServiceStatus(); 
     self.getInitialMessages();      
    });    
}, 

Это типичный концентратор стартер/ошибка обработчика рутина, чтобы получить движение.

+0

Спасибо, но это будет не так просто, потому что сервер использует https вместо http. – Speederer

Смежные вопросы