2013-10-20 18 views
16

Xin lưu ý rằng tôi đang tham chiếu rõ ràng SignalR 2.0 ở đây ... Tôi đã nhìn thấy một số phương pháp (khó chịu) cho điều này với SignalR 1.1/1.2 ... nhưng không cho 2.0.SignalR 2.0 thay đổi Json Serializer để hỗ trợ các kiểu đối tượng có nguồn gốc

Có ai có bất kỳ thành công nào với việc thay đổi bộ nối tiếp json mặc định SignalR 2.0 để cho phép gửi các kiểu có nguồn gốc không? Dựa trên những gì tôi đã đọc về SignalR 2.0, điều này có thể xảy ra, tuy nhiên, tôi không có may mắn và không tìm thấy một ví dụ đầy đủ ở bất cứ đâu.

Đây là cách tôi bắt đầu… bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

My 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(); 
      } 
     } 
    } 

Phương pháp trên

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

ứng dụng giao diện điều khiển kiểm tra Hub My (điều này công bố vào trung tâm)

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

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

Chỉ cần cho các biện pháp Cổ tốt. 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; 
      } 
     } 
    } 

Độ nghiêng đầu tiên của tôi là tôi đã bỏ qua việc thiết lập bộ nối tiếp trong máy khách. Vì vậy, tôi nói thêm như sau sau khi tạo kết nối nhưng trước khi việc tạo ra các proxy hub:.

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"); 

Tuy nhiên điều này chỉ dẫn đến một InvalidOperationException (dữ liệu không thể được gửi bởi vì kết nối ở trạng thái ngắt kết nối Gọi bắt đầu trước khi gửi bất kỳ dữ liệu nào.) trong lời gọi myDataHub.Invoke (..).

+2

Bạn đã bao giờ tìm ra điều này chưa? Tôi đang gặp vấn đề tương tự. – chad

+0

Cùng một vấn đề ở đây ... –

Trả lời

5

Đã lâu rồi kể từ khi câu hỏi này được hỏi. Để tham khảo trong tương lai, cần phải gọi phương thức myConnection.Start() sau khi tạo proxy, như thế này

myConnection = new HubConnection(endpoint); 

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

myConnection.Start(); 

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

Tôi không trả lời câu hỏi thực sự là "Cách thiết lập điều này trên Máy chủ?". Nó chỉ giải quyết vấn đề nhỏ được đề cập ở phần cuối của câu hỏi, khi tác giả nhắc đến những gì anh ta đã thử. –

Các vấn đề liên quan