2013-10-20 4 views
16

कृपया ध्यान दें कि मैं स्पष्ट रूप से सिग्नलआर 2.0 का संदर्भ दे रहा हूं ... मैंने सिग्नल 1.1/1.2 के साथ इसके लिए कुछ (गंदा) दृष्टिकोण देखा है ... लेकिन कोई भी नहीं 2.0 अभी तक।सिग्नलआर 2.0 जेसन सीरियलज़र को व्युत्पन्न प्रकार की वस्तुओं का समर्थन करने के लिए

क्या किसी को व्युत्पन्न प्रकारों को भेजने में सक्षम करने के लिए सिग्नलआर 2.0 डिफ़ॉल्ट जेसन सीरियलाइज़र को बदलने में कोई सफलता मिली है? सिग्नलआर 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); 
    } 

मेरे कंसोल परीक्षण ऐप पर विधि (इस केंद्र के लिए प्रकाशित करता है)

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

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

बस अच्छा उपाय स्टॉक के लिए। सीएस

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 (..) invocations के दौरान।

+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

मुझे असली सवाल का जवाब नहीं है जो "सर्वर पर इसे कैसे सेट करें?"। यह प्रश्न के अंत में उल्लिखित छोटे मुद्दे को हल करता है, जब लेखक इसका उल्लेख कर रहा है कि उसने पहले से क्या प्रयास किया है। –

संबंधित मुद्दे