You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ASP.NET Core Minimal API的F#项目中如何使用FromBody等属性

ASP.NET Core Minimal API F# 参数属性正确实现方式

在F#中直接用匿名Lambda处理Minimal API路由时,参数上的[FromBody]、[FromServices]属性无法被ASP.NET Core正确识别,核心原因是F# Lambda转换为Func<>委托时,参数属性不会被CLR保留。以下是两种可行的解决方案:

方案一:使用带属性参数的静态方法

定义一个包含处理逻辑的静态方法,在方法参数上直接标注对应的属性,再将方法作为委托传入MapGet:

// 定义处理类
type ApiHandlers =
    static member HandleGet([<FromBody>] body: Body, [<FromServices>] service: Service) =
        // 编写业务逻辑
        Results.Ok($"Processed body: {body}, using service: {service}")

// 注册路由
app.MapGet("/", ApiHandlers.HandleGet)

方案二:使用显式定义的委托类型

先声明一个带有属性参数的委托类型,再用Lambda实现该委托:

// 定义带属性的委托
type GetRequestHandler = delegate of [<FromBody>] Body * [<FromServices>] Service -> IResult

// 注册路由并实现逻辑
app.MapGet("/", GetRequestHandler(fun body service ->
    // 业务逻辑实现
    Results.Ok("Request processed successfully")))

为什么之前的尝试失败?

  • 案例1/2:F#匿名Lambda的参数属性无法被保留到生成的Func<>委托中,ASP.NET Core无法识别参数来源,导致编译或运行失败。
  • 案例3:柯里化后的函数转换为Func<>时,参数属性同样丢失,运行时ASP.NET Core无法推断参数应该从Body还是Services获取,因此抛出错误。

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 15:45:22