2015-06-15 7 views
7

समझना here के माध्यम से पढ़ना और उदाहरण here को देख:Owin WebSockets - IOwinContext और WebSocketAccept

मैं वास्तव में क्या WebSocketAccept वास्तव में करता है समझने की कोशिश कर रहा हूँ। मुझे पता है कि WebSocketAccept है:

using WebSocketAccept = 
    Action 
    < 
     IDictionary<string, object>, // WebSocket Accept parameters 
     Func // WebSocketFunc callback 
     < 
      IDictionary<string, object>, // WebSocket environment 
      Task // Complete 
     > 
    >; 

और इस तरह से प्रयोग किया जाता है:

public void Configuration(IAppBuilder app) 
    { 
     app.Use(UpgradeToWebSockets); 
     app.UseWelcomePage(); 
    } 

    // Run once per request 
    private Task UpgradeToWebSockets(IOwinContext context, Func<Task> next) 
    { 
     WebSocketAccept accept = context.Get<WebSocketAccept>("websocket.Accept"); 
     if (accept == null) 
     { 
      // Not a websocket request 
      return next(); 
     } 

     accept(null, WebSocketEcho); 

     return Task.FromResult<object>(null); 
    } 

तो कर actuallyt क्या स्वीकार किया जाता है()? क्या यह Func <> WebSocketAccept की संपत्ति को कॉल कर रहा है और एक विधि WebSocketEcho परिभाषित किया गया है? WebSocketEcho को इस प्रकार परिभाषित किया गया है:

private async Task WebSocketEcho(IDictionary<string, object> websocketContext) 

तो websocketContext कहां से आता है? क्या होगा यदि हम इसे पहचानने के बाद पाइपलाइन को आगे ले जाना चाहते हैं तो यह एक वेब सॉकेट अनुरोध है?

उत्तर

3

WebSocketAccept क्या है?

WebSocketAccept एक using alias

उदाहरण:

... 
using Foo.Bar 
using MyBar = Fee.Bar 
... 

यहाँ हम 2 अलग नामस्थान से बार प्रयोग कर रहे हैं, लेकिन हम 'MyBar' के साथ 2 एक उर्फ ​​तो हम दोनों के बीच अंतर कर सकते हैं।

वेबसाकेट एसेप्ट के रूप में उपनाम का उपयोग क्यों करें?

इस मामले में उपनाम सिर्फ एक सुविधा है, ताकि आपको पूरी चीज टाइप करने की आवश्यकता न हो, जिसका अर्थ है कि इसका उपयोग करते समय पूरा नाम लिखने के बजाय, आप इसके बजाय उपनाम का उपयोग कर सकते हैं।

समझौता WebSocketAccept

अगर हम देखने के करीब हम देखते हैं कि प्रकार है:

Action<A, B> 

इसका मतलब यह है कि यह मूलतः एक समारोह है कि वापस नहीं करता है और 2 तर्क लेता है, सी # लैम्ब्डा में है:

(A, B) => { } 

हम देखते हैं कि पहला तर्क (ए) है: IDictionary<string, object>, जिसे ओविन पर्यावरण भी कहा जाता है।

दूसरा तर्क है (बी) है: Func<C, D> जिसका अर्थ है कि यह एक ऐसा कार्य है जो C लेता है और D देता है। सी # लैम्ब्डा में:

(C) => { return D; } 

हम तो 2 तर्क (बी) के 1 तर्क (सी) में गोता लगाने की जरूरत है। और हम देखते हैं कि यह ओविन पर्यावरण लेता है और Task देता है।

क्या स्वीकार है?

acceptIOwinContext से पैरामीटर निकालने का प्रयास करता है और उन्हें WebSocketAccept प्रकार पर मानचित्रित करता है।

यदि यह उन्हें निकाला नहीं जा सकता है तो यह null है और हम अगले मध्यवर्ती पर आगे बढ़ते हैं।

अन्यथा यह एक वेबसाइकिल अनुरोध था और हम उस फ़ंक्शन को कॉल करते हैं जो 2 पैरामीटर (WebSocketAccept) लेता है, जैसा कि हमने ऊपर चर्चा की है (Action<A, B>)।

पहला पैरामीटर एक सामान्य शब्दकोश है, जिसमें वेबस्केट स्वीकार पैरामीटर शामिल हैं।

दूसरा पैरामीटर एक फ़ंक्शन है जो एक शब्दकोश लेता है और एक कार्य देता है।

यह फ़ंक्शन किसी और द्वारा बुलाया जाता है, कोड क्या करता है, कॉलर के साथ कॉलबैक फ़ंक्शन पास करता है।

कॉलर फिर सही तर्क के साथ फ़ंक्शन को कॉल करता है। क्योंकि कॉलर फ़ंक्शन के हस्ताक्षर को जानता है। वेबसाइकिल कनेक्शन अनुरोध को स्वीकार करने के बाद फ़ंक्शन को कॉल किया जाता है। इसलिए टिप्पणी कॉलबैक।

क्या होगा यदि हम इसे पहचानने के बाद पाइपलाइन को आगे ले जाना चाहते हैं तो यह एक वेब सॉकेट अनुरोध है?

उदाहरण में

खैर, कॉलबैक फ़ंक्शन WebSocketEcho है, लेकिन अनिवार्य रूप से आप किसी भी समारोह प्रेषित कर सकता है, इस बात का समारोह हस्ताक्षर को संतुष्ट करता है:

Task MyCallbackFunction(IDictionary<string, object> context) 
{ 
    // Do something 
    return Task.FromResult(0); 
} 

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

WebSocketEcho समारोह हर ग्राहक के लिए एक बार कहा जाता है, और जब तक ग्राहक कनेक्शन बंद करने के लिए चुनता लूप है। इस बीच यह जो कुछ भी प्राप्त करता है उसे वापस गूंजता है।

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

संपादित
मैं अपने खुद के प्रयोग के साथ देखा, कि अगर आप कॉलबैक फ़ंक्शन से लौटने कि websocketContext कनेक्शन Abort एड किया जाएगा। जिसका अर्थ है आप नहीं भेज/अगर आप कॉलबैक समाप्त होने के बाद चारों ओर websocketContext पारित कनेक्शन पर प्राप्त कर सकते हैं।

अद्यतन
पिछली बार मैंने एक Windows 2008 R2 आईआईएस 7.5 सर्वर पर इस का उपयोग करने के मैं WebSocket काम करने के लिए नहीं मिल सका की कोशिश की। इसके बाद: https://stackoverflow.com/a/14130152/1640121 - आईआईएस 7.5 सर्वर websockets का समर्थन नहीं करता है।
इसका मतलब है कि यदि आपके आवेदन आईआईएस 7.5 में होस्ट किया गया है यह WebSockets करने में सक्षम नहीं होगा।

  1. एक अलग आवेदन उपयोग करें, उदा:

    तो मैं एक संभव समाधान के बारे में सोचा एक सेवा कार्यक्रम (आईआईएस के बाहर) जो वेबसाइकिल अनुरोधों को संभालता है।

  2. सेवा आवेदन

करने के लिए अनुरोध यह मेरे लिए बहुत बोझिल महसूस किया है, जो मुझे एक तरफ अभी के लिए एक WebSocket को लागू कर दिया बनाया मैप करने के लिए एक रिवर्स प्रॉक्सी का उपयोग करें ...

+1

मैं 400 गलत अनुरोध हो रही है एक ही कोड की कोशिश करते समय। – Jigar

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