2013-10-20 3 views
16

Обратите внимание, что я прямо ссылаюсь на SignalR 2.0 здесь ... Я видел некоторые (противные) подходы для этого с SignalR 1.1/1.2 ... но ни один из 2.0.SignalR 2.0 изменить Json Serializer для поддержки объектов производного типа

Удалось ли кому-нибудь добиться успеха в изменении стандартного json-сериализатора SignalR 2.0, позволяющего отправлять производные типы? Основываясь на том, что я прочитал о SignalR 2.0, это должно быть возможно, однако, мне не повезло и нигде не нашел полного примера.

Вот как я начал ... любая помощь будет оценена.

Мои Startup.cs

[assembly: OwinStartup(typeof(SignalRChat.Startup))] 
    namespace SignalRChat 
    { 

     public class Startup 
     { 
      public void Configuration(IAppBuilder app) 
      { 
       // this should allow the json serializer to maintain the object structures 
       var serializer = new JsonSerializer() 
       { 
        PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
        TypeNameHandling = TypeNameHandling.Objects, 
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
       }; 

       // register it so that signalr can pick it up 
       GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

       app.MapSignalR(); 
      } 
     } 
    } 

Метод на

public void AddStock(Stock stock) 
    { 
     string stockType = stock.GetType().ToString(); 
     Console.WriteLine("The type of stock we got was: " + stockType); 
    } 

Мой тест консольного приложения Hub (это публикует на ступице)

myDataHub.Invoke("AddStock", new NyseStock() 
    { 
     Company = "Microsoft", 
     NyseSymbol = "MSFT" 
    }); 

    myDataHub.Invoke("AddStock", new DaxStock() 
    { 
     Company = "Microsoft", 
     DaxSymbol = "DMSFT" 
    }); 

Просто для хорошей мерой запаса. cs

namespace Messages 
    { 
     public class Stock 
     { 
      public string Company 
      { 
       get; 
       set; 
      } 
      public decimal Price 
      { 
       get; 
       set; 
      } 
     } 

     public class NyseStock : Stock 
     { 
      public string NyseSymbol 
      { 
       get; 
       set; 
      } 
     } 

     public class DaxStock : Stock 
     { 
      public string DaxSymbol 
      { 
       get; 
       set; 
      } 
     } 
    } 

Мое первое наклонение состояло в том, что я пренебрег настройкой сериализатора в клиенте. Поэтому я добавил следующее после создания соединения, но до создания хаба прокси:.

myConnection = new HubConnection("http://localhost:64041/"); 
    // Update the serializer to use our custom one 
    myConnection.JsonSerializer = new JsonSerializer() 
    { 
     PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
     TypeNameHandling = TypeNameHandling.Objects, 
     TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
    }; 

    //Make proxy to hub based on hub name on server 
    myDataHub = myConnection.CreateHubProxy("DataHub"); 

Однако это только привело к InvalidOperationException (данные не могут быть отправлены, так как соединение находится в отключенном состоянии Позвони старт перед отправкой любых данных.) во время вызовов myDataHub.Invoke (..).

+2

Вы когда-нибудь понять это? Я сталкиваюсь с той же проблемой. – chad

+0

Такая же проблема здесь ... –

ответ

5

Прошло некоторое время, так как этот вопрос был задан. Для дальнейшего использования, myConnection.Start() метод должен вызываться после создания прокси, как этот

myConnection = new HubConnection(endpoint); 

proxy = _conn.CreateHubProxy("DataHub"); 
proxy.On<string>("ServerEvent", ClientHandler); 

myConnection.Start(); 

proxy.Invoke("hubMethod", ...); 
+0

Я не отвечаю на реальный вопрос: «Как настроить это на сервере?». Он решает только небольшую проблему, упомянутую в конце вопроса, когда автор упоминает, что он уже пробовал. –

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

  • Нет связанных вопросов^_^