क्या मैं सिग्नलआर और एक प्रतिष्ठित एपीआई दोनों को शामिल कर सकता हूं?


116

मेरे पास ASP.NET का उपयोग करके एक एकल पेज वेब ऐप विकसित किया गया है। मैंने हाल ही में सिग्नल आधारित लाइब्रेरी का उपयोग करके कई वेब तरीकों को आधारित बनाया है। यह वास्तव में पृष्ठ को काफी बढ़ा देता है और पेज से बहुत सारे सर्वर कॉल को कम कर देता है।

उसी समय, मैं सर्वर-साइड तरीकों में से कुछ के लिए RESTful ASP.NET WebAPI को भी देख रहा हूं, वास्तविक सुंदरता के साथ यह एक ही समय में बाहरी अनुप्रयोगों के लिए एक एपीआई बनाने की अनुमति देता है जो मैं विकसित करता हूं कोर एप्लिकेशन (जो मैं कर रहा हूं उसके लिए महत्वपूर्ण होगा)।

हालांकि, यह कई लेखों और इन दो प्रश्नों को देखने के बाद लगता है , कि पुश और वेबएपीआई तरीके क्लाइंट-सर्वर संचार के लिए दो पूरी तरह से अलग प्रतिमानों की तरह लगते हैं। मुझे यकीन है कि मैं विभिन्न तरीकों का निर्माण कर सकता हूं जिन्हें या तो प्रोटोकॉल के माध्यम से एक्सेस किया जा सकता है, लेकिन मैं अनिश्चित हूं कि अगर इस पर कोई नुकसान हो या अगर इसे मैला समझा जाए - तो मैं जो लक्ष्य कर रहा हूं उसे प्राप्त करने का एक और अधिक सुंदर तरीका है। के लिये।

निश्चित रूप से ऐसे हालात हैं जिनमें मैं RESTful WebAPI को सिग्नलआर हब के माध्यम से घटनाओं को प्रसारित करना चाहता हूं ... विपरीत (सिग्नलआर को कभी वेबपीआई तक पहुंचने की आवश्यकता होती है) कम संभावना लगती है, लेकिन मुझे लगता है कि अभी भी संभव है।

क्या किसी ने ऐसा किया है? किसी को कोई सलाह या सुझाव है कि कैसे आगे बढ़ें? यहां सबसे सुरुचिपूर्ण तरीका क्या होगा?


4
इस ब्लॉग पोस्ट के वीडियो पर एक नज़र डालें । यह बताता है कि आप सिग्नलरी के साथ वेबएपीआई का उपयोग कैसे कर सकते हैं।
david.s

@ david.s को उस vid के माध्यम से स्किमिंग करते हुए, यह सही लगता है। इसे उत्तर के रूप में पोस्ट करें और मैं इसे चिह्नित करूंगा।
mbeasley

जवाबों:


85

इस ब्लॉग पोस्ट के वीडियो पर एक नज़र डालें । यह बताता है कि आप सिग्नलरी के साथ वेबएपीआई का उपयोग कैसे कर सकते हैं।

अनिवार्य रूप से, वेब एपीआई + सिग्नलआर एकीकरण इस वर्ग में शामिल हैं :

public abstract class ApiControllerWithHub<THub> : ApiController
    where THub : IHub
{
    Lazy<IHubContext> hub = new Lazy<IHubContext>(
        () => GlobalHost.ConnectionManager.GetHubContext<THub>()
    );

    protected IHubContext Hub
    {
        get { return hub.Value; }
    }
}

बस इतना ही। :)


43
ASP.NET वेब एपीआई में सिग्नलआर को जोड़ने के लिए सीधे आने के लिए, वीडियो को 33:35 समय पर अग्रेषित करें।
बाइटफायर

वीडियो HTTPS पर लोड नहीं होता है, अगर आपके पास HTTPS को बाध्य करने के लिए एक ब्राउज़र प्लगइन है तो आपको इसे निष्क्रिय करने की आवश्यकता हो सकती है
JMK

14
@bytefire: वास्तव में, वेब एपीआई + सिग्नलआर एकीकरण लगभग शुरू होता है। 55 मिनट पर।
डेनिस

2
@ davids.s: मुझे पता है, कि मुझे थोड़ी देर हो गई है, लेकिन लिंक के लिए धन्यवाद। मैंने आगे पाठकों के लिए एक अंश जोड़ा है।
डेनिस

1
नहीं IAppBuilder.MapSignalR ()?
जोश सटरफील्ड

18

सिग्नलआर वास्तव में पहले से ही वेबएपीआई स्रोत vNext (4.1) में शामिल है।

यदि आप RTM बिल्ड का उपयोग नहीं करते हैं, लेकिन इसके बजाय एक कोड कोड बनाएं, तो आप देखेंगे कि वहां एक नया प्रोजेक्ट है जिसे System.Web.Http.SignalRआप उपयोग कर सकते हैं। इसे इस प्रतिबद्ध के साथ कुछ दिनों पहले जोड़ा गया था - http://aspnetwebstack.codeplex.com/SourceControl/changeset/7605afebb159

नमूना उपयोग (जैसा कि कमिट में बताया गया है):

public class ToDoListController : HubController<ToDoListHub>
{
    private static List<string> _items = new List<string>();

    public IEnumerable<string> Get()
    {
        return _items;
    }

    public void Post([FromBody]string item)
    {
        _items.Add(item);
        // Call add on SignalR clients listening to the ToDoListHub
        Clients.add(item);
    }
}

यदि आप अभी के लिए vNext पर स्विच नहीं करना चाहते हैं, तो आप हमेशा संदर्भ के लिए उस कोड का उपयोग कर सकते हैं।

यह कार्यान्वयन बहुत समान है (थोड़ा अधिक पॉलिश किया गया है, परीक्षण आदि शामिल हैं) ब्रैड विल्सन ने एनडीसी ओस्लो में क्या दिखाया - http://vimeo.com/43603472


4
मैंने सर्वर पर किया है। लेकिन क्लाइंट को कनेक्ट नहीं कर सकते। क्या आप जानते हैं कि उपरोक्त क्लाइंट के साथ .NET क्लाइंट कैसे कनेक्ट किया जाए?
बाइटफायर

3
मैं वेब एपीआई 5.2.3 और सिग्नलआर 2.2.1 का उपयोग कर रहा हूं और यह वर्ग कहीं नहीं पाया जा सकता है। क्या किसी को इतिहास पता है? क्या यह RTM से पहले yanked था? अंत में, मैंने सिर्फ david.s की वर्ग परिभाषा की नकल की, लेकिन मैं उत्सुक हूं कि क्या हो रहा है।
कॉलिन

1
@ 40Alpha - मुझे लगता है कि हमने हब में स्थिर तरीकों को समाप्त कर दिया है जो GlobalHost.ConnectionManager.GetHubContext () (या ASP.NET कोर समतुल्य) का उपयोग करते हैं, और API नियंत्रक से उन स्थिर विधियों को कॉल करते हैं।
कॉलिन

3

यहां दो तकनीकों का एकीकरण दिखाया गया एक वीडियो है http://channel9.msdn.com/Events/TechDays/Belgium-2013/25 और यहां एकीकरण के लिए एक NuGet पैकेज है https://www.nuget.org/ संकुल / Microsoft.AspNet.WebApi.SignalR /


2
वेब एपीआई एप्लिकेशन के साथ कोड कॉन्ट्रैक्ट्स का उपयोग करते समय यह पैकेज अब टूट गया है, क्योंकि इसके लिए गैर-जेनेरिक की आवश्यकता होती है IHubConnectionContext, जिसे बदल दिया गया था IHubConnectionContext<T>। स्वीकृत उत्तर जाने का एक तरीका है।
डेनिस

जब भी यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, तो यहां उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर होगा । कृपया इसे ठीक करने के लिए अपने उत्तर को संपादित करें, फिर संयुक्त राष्ट्र से डिलीट करने का अनुरोध करने के लिए अपना झंडा चिह्नित करें
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.