首页 > 解决方案 > 如何在 WebAPI 中使用 F# 语法返回条件状态代码

问题描述

在考虑 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

但是,我收到以下错误:

错误 FS0193 类型约束不匹配。“ActionResult”类型与“IActionResult”类型不兼容

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

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

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

但是,我不想仅仅为了返回状态码而抛出异常。

标签: f#asp.net-web-api2

解决方案


我总是使用控制器基类上的方法来创建返回值。您应该能够通过更改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

推荐阅读