如何在 WebAPI 中使用 F# 语法 return 条件状态代码

How do I return conditional status codes using F# syntax in WebAPI

在考虑 ActionResult 的快乐路径场景和悲伤路径场景时,我正在努力弄清楚如何让编译器快乐。

我认为我可以做到以下几点:

[<HttpGet>]
member x.GetQuery([<FromQuery>] restaurant:string) =

    restaurant 
    |> Name 
    |> Query.menu
    |> function
       | Error _ -> (x.StatusCode 500)                          :> IActionResult
       | Ok    v -> ActionResult<DataTransfer.MenuItemTypes>(v) :> IActionResult

但是,我收到以下错误:

Error FS0193 Type constraint mismatch. The type 'ActionResult' is not compatible with type 'IActionResult'

如果我这样做,我可以获得要编译的代码:

[<HttpGet>]
member x.GetQuery([<FromQuery>] restaurant:string) =

    restaurant 
    |> Name 
    |> Query.menu
    |> function
       | Error _ -> failwith "Internal Server Error"
       | Ok    v -> ActionResult<DataTransfer.MenuItemTypes>(v)

但是,我不想仅针对 return 状态代码抛出异常。

我总是使用控制器基础 class 上的方法来创建 return 值。您应该能够通过将 Ok 大小写更改为使用 Ok 方法来使其在您的第一个示例中工作:

[<HttpGet>]
member x.GetQuery([<FromQuery>] restaurant:string) =

    restaurant 
    |> Name 
    |> Query.menu
    |> function
       | Error _ -> x.StatusCode(500) :> IActionResult
       | Ok    v -> x.Ok(v) :> IActionResult