2013-03-12 9 views
13

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

मैं एक एएसपी.नेट एमवीसी .NET Framework 4 प्रोजेक्ट में एक सिग्नल 1.0.1 सर्वर चला रहा हूं। मेरे पास जावास्क्रिप्ट क्लाइंट के माध्यम से कनेक्ट करने का प्रयास कर रहे एक अलग डोमेन (विभिन्न लोकहोस्ट पोर्ट) पर एक और एएसपी.NET एप्लिकेशन है। मैं इस जब अपने आवेदन कनेक्ट करने के लिए कोशिश करता है:

XMLHttpRequest cannot load http://localhost:31865/api/negotiate?_=1363105027533. 
Origin http://localhost:64296 is not allowed by Access-Control-Allow-Origin. 

मैं SignalR साथ क्रॉस-डोमेन समर्थन को सक्षम करने के लिए सभी चरणों का पालन किया - मैं क्या याद आ रही है?

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

मैं यू हूँ:

  • jQuery.support.cors = true;
  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });
  • RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
  • RouteTable.Routes.MapConnection<ApiConnection>("/api", "api");

मैं भी एपीआई परियोजना में Web.config के लिए निम्न जोड़ा मेरे सिग्नल सर्वर के लिए एक PersistentConnection गाओ, हब्स नहीं।

कोई विचार?

+0

हैलो @ हेलटर 73, क्या आप सिग्नलआर का उपयोग करके कई चैट रूम के लिए मुझे डेमो प्रदान कर सकते हैं। मैं chat.stackoverflow.com या किसी भी लिंक जैसे चैट सर्वर को कार्यान्वित करना चाहता हूं। क्रिप्या मेरि सहायता करे। मेरे पास एक डेमो है लेकिन काम नहीं कर रहा है। क्या आप मुझे अपना डेमो ईमेल कर सकते हैं? –

+0

मेरा ईमेल आईडी है: [email protected]। यदि आपके पास कोई डेमो है तो कृपया मुझे भेजें। –

उत्तर

15

MapHubs आपके सभी Hub कक्षाओं के साथ संवाद करने के लिए/सिग्नल पर एक एंडपॉइंट कॉन्फ़िगर करेगा। चूंकि आप हब्स का उपयोग नहीं कर रहे हैं, इसलिए MapHubs पर कॉल अनावश्यक है। MapHubs पर कॉल का आपके/एपीआई कनेक्शन की कॉन्फ़िगरेशन पर कोई प्रभाव नहीं पड़ता है।

MapConnection को आपका कॉल के रूप में इस पढ़ने के लिए बदल दिया जाना चाहिए:

RouteTable.Routes.MapConnection<ApiConnection>("api", "api", 
    new ConnectionConfiguration { EnableCrossDomain = true }); 

नोट:MapConnection को दूसरा तर्क यूआरएल है। पहला तर्क मार्ग का नाम है। / अनावश्यक है, लेकिन किसी भी मामले में वास्तव में चोट नहीं पहुंचाता है।

  • स्थापना jQuery.support.cors = true;ही किया जा चाहिए "वातावरण CORS का समर्थन नहीं करते अभी तक में क्रॉस-डोमेन अनुरोध सक्षम करने के लिए अनुमति देते हैं लेकिन क्रॉस-डोमेन एक्सएचआर अनुरोध (विंडोज़ गैजेट, आदि)" [1]। यह आईई या किसी अन्य ब्राउज़र के किसी भी संस्करण से संबंधित नहीं है जिसे मैं जानता हूं। यदि ब्राउज़र सीओआरएस का समर्थन नहीं करता है, तो सिग्नलआर पहले ही स्वचालित रूप से JSONP पर वापस आ जाएगा जब तक आप jQuery.support.cors को सत्य पर सेट करते हैं।

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

  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true }); गलत है।आप केवल आवश्यकता चाहिए

    var connection = $.connection('http://localhost:31865/api'); 
    

    xdomain नहीं रह गया है SignalR जे एस ग्राहक के लिए एक विकल्प है, और आप वास्तव मेंjsonp निर्दिष्ट करने के लिए चाहते हैं, तो आप इसे क्या करना चाहिए जब आप start तो जैसे कनेक्शन:

    connection.start({ jsonp: true}).done(function() { /* ... */ }); 
    

    मैं, दोहराना चाहिए कि SignalR अगर पर्यावरण CORS का समर्थन नहीं करता होगा स्वचालित रूप से गिरावट वापस JSONP ताकि आप इस सेशन निर्दिष्ट नहीं करना चाहिए खुद को टियर करें। JSONP को Access-Control-Allow-Origin शीर्षलेख की आवश्यकता नहीं है, लेकिन यह सिग्नलआर को अपने सबसे अक्षम परिवहन का उपयोग करने के लिए मजबूर करता है: लंबे मतदान।

  • आपको अपने वेब.कॉन्फिग में customHeaders सेट करने की आवश्यकता नहीं है। जब आप में EnableCrossDomain को सत्य में सेट करते हैं तो सिग्नलआर Access-Control-Allow-Origin हेडर को स्वचालित रूप से सिग्नल प्रतिक्रियाओं में सेट करेगा।

PersistentConnections का उपयोग कर abut अधिक सलाह के लिए संदर्भ https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections

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