F # позволяет Cors веб-API - PullRequest
       9

F # позволяет Cors веб-API

0 голосов
/ 26 сентября 2018

В настоящее время я разрабатываю веб-API с использованием f #, я совершенно новичок в этом, поскольку пришел из ac # background, и я хотел бы получить данные из приложенияactjs.Но мне нужно разрешить cors на моем f # webapi.Я полностью потерян, когда я пытаюсь позволить Cors.Пока что я добавил:

member this.ConfigureServices(services: IServiceCollection) =
    services.AddCors() |> ignore

и попытался добавить

app.UseCors() |> ignore

к элементу конфигурации, но я не понимаю, как реализовать этот метод, чтобы разрешить cors вмое заявление.Я также пытался добавить

[<EnableCors("...")>]

на свой контроллер, но я не знаю, что в него вставить

Любая помощь будет очень признателен

Редактировать 1:Итак, вот что у меня есть:

module ConfigurationCors =
    let ConfigureCors(corsBuilder: CorsPolicyBuilder): unit =        
        corsBuilder.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials() |> ignore

open ConfigurationCors

type Startup private () =
    new (configuration: IConfiguration) as this =
        Startup() then
        this.Configuration <- configuration 

    // This method gets called by the runtime. Use this method to add services to the container.
    member this.ConfigureServices(services: IServiceCollection) =
        // Add framework services.
        services.AddCors() |> ignore


services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1) |> ignore


// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
member this.Configure(app: IApplicationBuilder, env: IHostingEnvironment) =
    if (env.IsDevelopment()) then
        app.UseDeveloperExceptionPage() |> ignore
    else
        app.UseHsts() |> ignore
    app.UseHttpsRedirection() |> ignore
    app.UseMvc() |> ignore
    app.UseCors(Action<CorsPolicyBuilder> ConfigureCors) |> ignore

member val Configuration : IConfiguration = null with get, set

У меня есть экземпляр модуля и функции внутри него, которые я передаю в UseCors, но кажется, что это не работает, это хороший способ?Если у кого-то есть подсказка, и он может мне помочь.

Вот мой метод получения в моем приложении реакции:

 fetch('https://localhost:44323/api/values')
    .then(response => response.json())
    .then(data => {
      console.log(data)
    })

1 Ответ

0 голосов
/ 28 сентября 2018

В соответствии с MSDN документ , я подозреваю, что вы должны позвонить UseCors промежуточное программное обеспечение до UseMvc:

app.UseCors(Action<CorsPolicyBuilder> ConfigureCors)
   .UseMvc()
   .UseHttpsRedirection()

Ниже мой первый ответ, поэтому я хотел быоставьте это как общее решение для CORS на стороне сервера.

Чтобы разрешить CORS на стороне сервера, вам придется установить заголовки ответа "Access-Control-Allow-Origin" в "*" (или ограничить набором разрешенныхпроисхождение).

Вот простой HttpListener, который устанавливает заголовки на HttpListenerResponse:

module Server

open System
open System.Net

type HttpHandler = (HttpListenerRequest -> HttpListenerResponse -> Async<unit>)

type HttpListener with
    static member Run (url: string, handler: HttpHandler) =
        let listener = new HttpListener ()
        listener.Prefixes.Add url
        listener.Start ()
        let asynctask = Async.FromBeginEnd(listener.BeginGetContext, listener.EndGetContext)
        async {
            while true do
                let! ctx = asynctask
                // Add the headers here
                ctx.Response.AddHeader ("Access-Control-Allow-Origin", "*")
                Async.Start (handler ctx.Request ctx.Response)
        } |> Async.Start
        listener

let run port = 
    HttpListener.Run ("http://localhost" + port + "/", fun req res ->
        async {
            let out = Text.Encoding.ASCII.GetBytes "Hello, Mars!"
            res.OutputStream.Write (out, 0, out.Length)
            res.OutputStream.Close()
        }
    ) |> ignore
    printfn "Running server on localhost:%s" port
    Console.Read () |> ignore

// Main.fs

open Server

[<EntryPoint>]
let main argv =
    Server.run ":3000"
    0

Если вы запустите клиент curl с curl http://localhost:3000 -v, вы сможете проверить CORSЗаголовки в ответе.

...