2013-05-22 12 views
7

मैं यह नहीं समझ सकता कि मैं वेबएपीआई एपीकंट्रोलर से सिग्नलआर हब में कैसे कॉल कर सकता हूं। मैंने एक नमूना एक साथ रखा है जिसे आप here डाउनलोड कर सकते हैं जो समस्या को सरल बनाता है और इस मुद्दे को प्रदर्शित करता है।वेबएपीआई नियंत्रक मुद्दों से सिग्नलआर हब को कॉल करना

  1. मैंने एएसपी.नेट एमवीसी वेबएपीआई टेम्पलेट से एक नई परियोजना बनाई।
  2. मैंने चैटहब नामक प्रोजेक्ट में एक नया सिग्नलर हब जोड़ा।
  3. लोड पर एक HTML पृष्ठ जोड़ा गया है, जो चैटबब से जुड़ता है, समूह में शामिल होता है और उस समूह को एक संदेश भेजता है। यह बहुत अच्छा काम करता है।
  4. एचटीएमएल पेज में एक बटन भी है जो क्लिक होने पर ValuesController की पोस्ट विधि में AJAX कॉल को आग लगा देगा। ValuesController की पोस्ट विधि में, मैं समूह के सभी जुड़े ग्राहकों को एक संदेश प्रसारित करना चाहता हूं। मैं इसे काम करने के लिए नहीं मिल सकता है।

मेरे पास केवल 2 विधियों के साथ एक सरल सिग्नलआर हब है।

[HubName("chat")] 
public class ChatHub : Hub 
{ 
    public void Join(string room) 
    { 
     // NOTE: this is not persisted - .... 
     Groups.Add(Context.ConnectionId, room); 
    } 

    public void Send(string room, string message) 
    { 
     var msg = String.Format(
      "{0}: {1}", Context.ConnectionId, message); 
     Clients.Group(room).newMessage(msg); 
    } 
} 

मैंने एक बहुत ही सरल HTML पृष्ठ बनाया जो चैट केंद्र से कनेक्ट होता है जब डोम यहां दिखाया गया है।

<html> 
<head> 
    <title>Simple Chat</title> 
    <script src="Scripts/jquery-1.8.2.js" type="text/javascript"></script> 
    <script src="Scripts/jquery.signalR-1.0.0.js"></script> 
    <script src="signalr/hubs"></script> 
    <script type="text/javascript"> 
     var chat; 

     //$(function() { 
     // connectToHubs(); 
     //}); 
     $(connectToHubs); 
     function connectToHubs() { 
      $.connection.hub.logging = true; 

      chat = $.connection.chat; 
      chat.client.newMessage = onNewMessage; 

      $.connection.hub.start({ transport: 'longPolling' }).done(function() { 
       chat.server.join("TestGroup").done(function() { 
        chat.server.send("TestGroup", "message from html"); 
       }); 
      }); 

      $('#controller').click(postProficiencyUserAction); 



     } 
     var postProficiencyUserAction = function() { 
      //var token = $('[name=__RequestVerificationToken]').val(); 
      var headers = {}; 
      //headers["__RequestVerificationToken"] = token; 
      //var userAction = { createdOn: "2013-05-21T00:00:00", userId: "12345678-1234-1234-1234-000000000001", actionId: "12345678-1234-1234-1234-000000000003" }; 
      $.ajax({ 
       type: 'POST', 
       url: 'http://localhost:58755/api/values', 
       cache: false, 
       headers: headers, 
       contentType: 'application/json; charset=utf-8', 
       data: 'test', 
       dataType: "json", 
       success: function() { 

       }, 
       error: function() { 

       } 
      }); 
     }; 
     function onNewMessage(message) { 
      // ... todo: validation !!!! :) 
      $('#messages').append('<li>' + message + '</li>'); 
     }; 

    </script> 
</head> 
<body> 
    <div> 
     <h2>Chat</h2> 
     <input type="button" id="controller" value="Controller Method" /> 
     <div> 
      <h2>Message(s) Received</h2> 
      <ul id="messages"></ul> 
     </div> 
    </div> 
</body> 
</html> 

कुछ भी नहीं फैंसी। जब भी कनेक्टेड हब एक नया संदेश प्राप्त करता है, तो अनियंत्रित सूची में एक नया आइटम जोड़ा जाता है। एक बटन है जो अलेक्स को ValuesController पोस्ट विधि में कॉल करता है।

public class ValuesController : ApiController 
{ 
    // POST api/values 
    public void Post([FromBody]string value) 
    { 
     var hubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>(); 
     hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller"); 
    } 

हब कॉल काम नहीं करता है। एक त्रुटि फेंक नहीं है, लेकिन, संदेश कभी प्राप्त नहीं हुआ है। हब की "भेजें" विधि में ब्रेकपॉइंट डालना या तो काम नहीं करता है। मुझे लगता है कि मैं इसे सही कर रहा हूं। कोई भी मदद करता है? फिर, स्रोत कोड पाया जा सकता है here

उत्तर

14

आप क्लाइंट पर विभिन्न तरीकों बुला रहे हैं:

एपीआई नियंत्रक

hubContext.Clients.Group("TestGroup").send("TestGroup", "Called from Controller"); 

हब

Clients.Group(room).newMessage(msg); 

विधि आप कॉल करना चाहते newMessage है

chat.client.newMessage = onNewMessage; 
नहीं भेजें
+0

डेविड, बहुत बहुत धन्यवाद। तो यह सर्वर पर दिखाई देता है, मैं hubContext.Clients.Group ("testGroup") जैसे hubContext.Clients.Group ("testGroup") से किसी भी विधि को कॉल कर सकता हूं। हैलोनेट और क्लाइंट स्वचालित रूप से उसी प्रतिक्रिया का जवाब दे पाएगा बनाया विधि। पागल। मुझे सी # गतिशील क्षमताओं पर अध्ययन करने की आवश्यकता है :-) – DapperDanh

+0

यह बात है :) – davidfowl

+0

@dfowler: क्या एपीकंट्रोलर से वास्तविक ChatHub.Send विधि को कॉल करने का कोई तरीका है? ऐसा करने का उपरोक्त तरीका ChatHub को बाईपास करना है और सीधे चैटब्यूब के समतुल्य करने के लिए हब संदर्भ में सीधे जाएं। लेकिन मेरे पास ChatHub में कुछ भी है। सैंड नहीं चलाएगा \ में दोहराने की आवश्यकता होगी ApiController? शायद मैं यहाँ कुछ याद कर रहा हूँ। – mutex

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