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

时间:2019-07-09 14:19:22

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

在努力考虑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)

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

1 个答案:

答案 0 :(得分:1)

我总是使用控制器基类上的方法来创建返回值。通过将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