Suave

2017-06-04 2 views
5

में CORS के साथ एकाधिक शीर्षलेखों को अनुमति दें I CORS अनुरोध स्वीकार करने के लिए मेरा Suave API प्राप्त करने का प्रयास कर रहा हूं।Suave

http://www.fssnip.net/mL/title/CORS-response-with-Suave

कौन सा मैं यहाँ पुन: होगा:: मैं इस स्निपेट यहां का पालन किया है

let setCORSHeaders = 
    setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "content-type" 

let allow_cors : WebPart = 
    choose [ 
     OPTIONS >=> 
      fun context -> 
       context |> (
        setCORSHeaders 
        >=> OK "CORS approved") 
    ] 

let webSite = 
    choose [ 
     allow_cors 
     GET >=> OK "URLs are for wimps. GETting something? This is what you get." 
    ] 

लेकिन अब मैं अंतिमबिंदुओं कि एक टोकन में पारित करने की आवश्यकता होती है, और उन लोगों के अंतिम बिंदु त्रुटियों दे रहे हैं सीओआरएस में अनुपस्थित हेडर की वजह से। मेरा टोकन हेडर बस "टोकन" है, इसलिए मैंने दो चीजों की कोशिश की है, और दोनों ने इस मुद्दे को हल नहीं किया है।

प्रयास # 1

setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "content-type" 
    >=> setHeader "Access-Control-Allow-Headers" "token" 

यह लौटे एक त्रुटि कह content-type नहीं रह स्वीकार कर लिया गया है - यह सूचित करते हैं कि पिछले setHeader पहले एक है, जो जब आप यहाँ स्रोत कोड देखें अधिलेखित कर दिया लगता है: https://github.com/SuaveIO/suave/blob/master/src/Suave.Tests/HttpWriters.fs , लाइन 113 पर, एक परीक्षण है कि मेरे लिए यह वांछित व्यवहार का तात्पर्य है।

प्रयास # 2

इस प्रश्न पर प्रतिक्रिया के आधार पर: How to set a Json response in suave webpart, मैं एक अल्पविराम द्वारा पृथक सूची के माध्यम से दोनों हेडर सेट करने का प्रयास किया:

setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "Content-Type,token" 

लेकिन यह तो यह दर्शाता है एक त्रुटि दे दी है कि सीओआरएस पूरी तरह विफल रहा था:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401. 

इसके अलावा, इस प्रश्न पर आधारित, मैंने एफ की कोशिश की ollowing:

setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers:content-type" "Accept" 
    >=> setHeader "Access-Control-Allow-Headers:token" "Accept" 

कौन इस प्रतिक्रिया दी: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.

तो, मैं कैसे शिष्ट में एक CORS अनुरोध में हेडर की किसी भी राशि के लिए अनुमति देते हैं?

संपादित

प्रयास # 3

मैं addHeader बजाय setHeader प्रयोग किया है:

let setCORSHeaders = 
    setHeader "Access-Control-Allow-Origin" "*" 
    >=> addHeader "Access-Control-Allow-Headers" "content-type" 
    >=> addHeader "Access-Control-Allow-Headers" "token" 

कौन सा अब कह रहा है ... No 'Access-Control-Allow-Origin' header is present on the requested resource.

तो मुझे लगता है कि बदलने पहले setHeader से addHeader, मुझे अभी भी वही प्रतिक्रिया मिलती है।

फिक्स

addHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "token" 
    >=> addHeader "Access-Control-Allow-Headers" "content-type" 
    >=> addHeader "Access-Control-Allow-Methods" "GET,POST,PUT" 

काम किया - इस के बाद, वहाँ क्या भेजा जा रहा था के साथ मुद्दों है, लेकिन CORS के साथ ही ज्यादा कुछ नहीं थे।

उत्तर

4

setHeader के बजाय addHeader का उपयोग करने का प्रयास करें।

दिया साथ हैडर कुंजी जोड़ता है: आगे इकाई परीक्षण है कि आप पाया में नीचे बस कुछ ही लाइनों, वहाँ से पता चलता है कि यह अर्थ विज्ञान आप देख रहे हैं, और इसके प्रलेखन का कहना है कि addHeader के लिए एक परीक्षण है लौटा हेडर की सूची के लिए मूल्य, भले ही वह हेडर पहले से मौजूद है। इसका मतलब है कि सुवे key द्वारा संभावित रूप से अलग-अलग मानों के साथ दिए गए शीर्षलेख के साथ प्रतिक्रिया प्रदान करेगा।

ऐसा लगता है कि आप जिस व्यवहार को चाहते हैं।

+0

यह सही समझ में आया और इसे लागू करना आसान था, इसलिए स्वाभाविक रूप से यह अभी भी टूटा हुआ है :(कृपया ऊपर अपना संपादन देखें। – Max

+0

https://www.html5rocks.com/en/tutorials/cors/ कहता है कि 'एक्सेस-कंट्रोल -उलो-विधि 'भी आवश्यक है; क्या आप इसे कहीं भी सेट कर रहे हैं? यदि नहीं, तो यह हो सकता है कि वास्तविक समस्या अनुपलब्ध' एक्सेस-कंट्रोल-स्वीकृति-विधि 'शीर्षलेख है, और त्रुटि संदेश भ्रामक है। लेकिन मैं हूं केवल इस बिंदु पर अनुमान लगाया। मैं कहूंगा कि https://www.html5rocks.com/en/tutorials/cors/ पढ़ें और विभिन्न शीर्षलेख संयोजनों के साथ प्रयोग करते रहें जब तक कि आपको CORS शीर्षलेखों का सही सेट न मिल जाए। क्षमा करें मैं नहीं हो सकता इससे अधिक मदद की। – rmunn

+0

यह मुझे सही दिशा में ले जाता है - और यह पता चला है कि एक संपूर्ण 'Suave.CORS' नामस्थान है जो मैं पूरे समय इस्तेमाल कर सकता था, जो स्वाभाविक रूप से मुझे तब तक नहीं मिला जब तक कि मैंने इससे पहले काम नहीं किया मुद्दा – Max

1

मुझे एक ही समस्या थी। विरासत कारणों से मैं इस पल के लिए 1.1.3 के साथ फंस गया हूं, भले ही सुवे 2.2.1 उपलब्ध है। मैं एफ # के साथ वास्तव में परिचित नहीं हूँ लेकिन अंत में मैं इस तरह somehting के साथ इस काम कर पाने में कामयाब रहे:

let setCORSHeaders = 
    addHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "token" 
    >=> addHeader "Access-Control-Allow-Headers" "content-type" 
    >=> addHeader "Access-Control-Allow-Methods" "GET,POST,PUT" 

let app = 
    choose [ 
     GET >=> 
      fun context -> 
       context |> (
        setCORSHeaders 
        >=> choose 
         [ pathRegex "(.*?)\.(dll|mdb|log)$" >=> dllFilesRequest 
         pathRegex "(.*?)\.(html|css|js|png|jpg|ico|bmp)$" >=> staticFilesRequest 

         path "/" >=> indexRequest 
         path "/index" >=> indexRequest 
         path "/static" >=> staticFilesRequest 
         // ... 
         ]) 

     POST >=> 
      fun context -> 
       context |> (
        setCORSHeaders 
        >=> choose 
         [ 
         path "/something" >=> runSomething 
         // ... 
         ]) 
    ] 

मुझे यकीन है कि वहाँ एक pretier तरीका है हूँ।