2011-08-29 11 views
19

मेरे पास एक विंडोज सेवा के भीतर होस्ट की गई डब्ल्यूसीएफ आरईएसटी सेवा है और मैं प्रत्येक प्रतिक्रिया के साथ एक्सेस-कंट्रोल-ऑर्डर-ओरिजिनल HTTP हेडर (CORS के हिस्से के रूप में परिभाषित) भेजना चाहता हूं।डब्ल्यूसीएफ आरईएसटी सेवाओं के भीतर सीओआरएस समर्थन

मेरे प्रयास किया समाधान एक IDispatchMessageInspector कार्यान्वयन के भीतर निम्नलिखित की तरह कुछ है करने के लिए किया गया था:

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 
    if (httpResponse != null) 
    { 
     // test of CORS 
     httpResponse.Headers["Access-Control-Allow-Origin"] = "*"; 
    } 
} 

आम तौर पर यह काम करेगा, लेकिन दुर्भाग्य से मेरी सेवा भी HTTP basic authorization का उपयोग करता है, जब एक अनुरोध प्राधिकरण के बिना में आता है जिसका मतलब है हेडर, डब्ल्यूसीएफ स्वचालित रूप से 401 प्रतिक्रिया भेजता है जो प्रमाण-पत्रों के लिए पूछता है। दुर्भाग्यवश डब्ल्यूसीएफ इस शुरुआती एक्सचेंज के दौरान मेरे आईडीस्पैच मैसेज इंस्पेक्टर को कॉल नहीं करता है, इसलिए एक्सेस-कंट्रोल-ऑर्डर-ऑरिजन हेडर प्रारंभिक एक्सचेंज में नहीं जोड़ा जाता है।

समस्या तब होती है जब मैं ब्राउज़र से सेवा को कॉल करने का प्रयास करता हूं। सीओआरएस निर्दिष्ट करता है कि क्रॉस-मूल अनुरोधों को केवल तभी अनुमति दी जानी चाहिए जब मूल डोमेन एक्सेस-कंट्रोल-अनुमति-उत्पत्ति प्रतिक्रिया शीर्षलेख (* सभी डोमेन से मेल खाता है) में सूचीबद्ध डोमेन से मेल खाता हो। दुर्भाग्यवश जब ब्राउज़र एक्सेस-कंट्रोल-ऑब्जेक्ट-हेडर हेडर के बिना शुरुआती 401 प्रतिक्रिया देखता है, तो यह एक्सेस को रोकता है (same origin policy के अनुसार)।

क्या डब्ल्यूसीएफ द्वारा स्वचालित रूप से भेजे गए प्रारंभिक 401 प्रतिक्रिया में कोई शीर्षलेख जोड़ने का कोई तरीका है?

+0

क्या आपने कभी इसके साथ कहीं भी जाना है? –

उत्तर

6

जो भी आप चाहते हैं उसे प्राप्त करने के लिए आपको प्राधिकरण को संभालने की आवश्यकता है जो एक एचटीपी मॉड्यूल पंजीकृत करने के द्वारा संभव है ... वहां आप 401 जारी करेंगे और इसके साथ ही आप जिस भी http हेडर को चाहते हैं ... वहां भी एक नमूना कार्यान्वयन इतने पर यहाँ - देख Adding basic HTTP auth to a WCF REST service

संपादित करें - ओपी से टिप्पणी के बाद:

ओपी की टिप्पणी के बाद से कहता है कि वह स्वयं की मेजबानी समाधान HTTPModule साथ, लेकिन वास्तव में IDispatchMessageInspector.BeforeSendReply साथ और IDispatchMessageInspector.AfterReceiveRequest साथ नहीं है ।

प्राधिकरण को "कोई नहीं" और कस्टम लागू/IDispatchMessageInspector में कार्यान्वित किया जाना चाहिए - इस तरह आप 401 जारी करते समय कोई शीर्षलेख जोड़ सकते हैं। अन्यथा रनटाइम हैंडलिंग बेसिक ऑथ आपके IDispatchMessageInspector को उचित/सकारात्मक औथ से पहले नहीं बुलाएगा।

इस हालांकि सावधान इसका मतलब है कि आप सुरक्षा-sensitiv कोड अपने आप को लागू करने और इस प्रकार appriopriate उपाय लेने के लिए अपनी उचित कार्यान्वयन सुनिश्चित करने की जरूरत है काम करता है ...

+0

उत्तर के लिए धन्यवाद। मेरी सेवा को एक स्वयं-होस्टेड विंडोज सेवा होना चाहिए, आईआईएस होस्ट नहीं किया गया है। मेरी सेवा में HTTP मूल ऑथ सामान बहुत अच्छा काम करता है। सीओआरएस भी ठीक काम करता है (माना जाता है कि मैं मूल ऑथ अक्षम करता हूं)। समस्या केवल तभी होती है जब HTTP मूल और CORS को स्वयं-होस्ट की गई सेवा पर मिलाया जाता है। अगर मैं आईआईएस में सेवा होस्ट करना चाहता था, तो मैं आईआईएस को प्रत्येक अनुरोध पर सीओआरएस प्रतिक्रिया शीर्षलेख भेजने के लिए कॉन्फ़िगर करता हूं और HTTP मूल लेख के लिए एक HttpModule का उपयोग करता हूं। – Kevin

+0

ठीक है - मेरा संपादन देखें ... आपका समाधान पहले से ही आधा रास्ता था ... आपको एक अन्य विधि को लागू करने और कॉन्फ़िगरेशन बदलने की आवश्यकता है ... – Yahia

+0

क्लाइंट को प्रमाणित करना टाइप करें = "कोई नहीं" और निरीक्षण करने से मैन्युअल रूप से काम करना लगभग काम करता है। आप 401 उत्तर भेज सकते हैं, लेकिन डब्ल्यूसीएफ आपको डब्ल्यूडब्ल्यूडब्ल्यू-प्रमाणीकरण प्रतिक्रिया शीर्षलेख सेट करने की अनुमति नहीं देता है। कोड के भीतर डब्ल्यूडब्ल्यूडब्लू-प्रमाणीकरण सेट करने का प्रयास डब्लूसीएफ को 504 लौटने का कारण बनता है। डब्ल्यूडब्ल्यूडब्ल्यू के बिना-प्रमाणित करें कि ब्राउज़र प्रमाण-पत्रों के लिए संकेत नहीं देगा। – Kevin

22

यह आदमी मेरा दिन बचा लिया।

http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx

मुझे लगता है कि वेब पेज किसी दिन मर जाता है यहाँ अपने नोट्स में से कुछ जगह करने जा रहा हूँ, बस मामले में। (मैं खोजने नफरत लिंक "आपका जवाब सही यहाँ है", और फिर लिंक मर चुका है।)

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webSupport"> 
     <webHttp /> 
     <CorsSupport /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<services> 
    <service name="Service.JSonService"> 
    <endpoint address="http://localhost:8080" behaviorConfiguration="webSupport” binding="webHttpBinding" contract="Service.IJSonService" /> 
    </service> 
</services> 

अब, आप अपने डाउनलोड करने योग्य "WebHttpCors.dll" कहा जाता पुस्तकालय लगाना होगा।

लेकिन वहां एक रेज़ोल्यूशन के लिए अपना रास्ता जोड़ने/मदद करने के लिए पर्याप्त (ऊपर) पर्याप्त है।

जो भाग मुझे लूप (मेरे परिदृश्य में) के लिए फेंक रहा था वह यह है कि आईई काम कर रहा था, लेकिन फ़ायरफ़ॉक्स काम नहीं कर रहा था।

मेरे उद्भव पेज था:

http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh 

तो मैं स्थानीय होस्ट < < था - >> स्थानीय होस्ट यातायात:

http://localhost:53692/test/WCFCallTestViaJQ14.htm 

तो मेरी सेवा में है।

**** लेकिन बंदरगाह अलग थे। (536 9 2 और 8002) ****

आईई इसके साथ ठीक था। फ़ायरफ़ॉक्स इसके साथ ठीक नहीं था।

तब आपको याद रखना होगा कि प्रत्येक ब्राउज़र उनके हैंडल() अनुरोध अलग-अलग करता है (JQUERY के अंदर)।

यह सब अब समझ में आता है।

//JavaScript snipplet 

if (window.XMLHttpRequest) { 

    returnObject = new XMLHttpRequest(); 

} else if (window.ActiveXObject) { 

    returnObject = new ActiveXObject("Microsoft.XMLHTTP"); 

} else { 

msg = "Your browser doesn't support AJAX!"; 

} 

यहां कुछ महत्वपूर्ण शब्द हैं, वाक्यांश जो मैं गुगल/बिंगिंग कर रहा हूं जो अंत में मुझे कहीं और ले गया।

Result: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:53692/test/WCFCallTestViaJQ14.htm :: HandleJQueryError :: line 326" data: no] 


XMLHttpRequest Send "NS_ERROR_FAILURE" 

JQuery Ajax WCF Self Hosted CORS JSON 
+0

सभी विवरणों के लिए उपरोक्त। लिंक सड़ांध के खिलाफ अच्छी लड़ाई जारी रखें! – codekaizen