6

Suave API に CORS リクエストを受け入れさせようとしています。私はここでこのスニペットに従いました:

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."
    ]

しかし、トークンを渡す必要があるエンドポイントがあり、CORS で許可されたヘッダーが見つからないため、これらのエンドポイントでエラーが発生しています。私のトークン ヘッダーは単に「トークン」であるため、2 つのことを試しましたが、どちらも問題を解決していません。

試み #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"

しかし、これにより、CORS が完全に失敗したことを示すエラーが発生しました。

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.

また、この同じ質問に基づいて、次のことを試しました。

    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.

では、Suave の 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

2 に答える 2

5

addHeaderの代わりに使ってみてくださいsetHeader。見つけた単体テストのさらに数行下に、addHeader探しているセマンティクスがあることを示すテストがあり、そのドキュメントには次のように記載されています。

そのヘッダーが既に存在する場合でも、返されたヘッダーのリストに、指定された値を持つヘッダー キーを追加します。これは、Suave がkey、おそらく異なる値で示されるヘッダーを持つ応答を提供することを意味します。

これは、あなたが望んでいる動作のように見えます。

于 2017-06-05T00:34:57.137 に答える