在F#Web Api项目中使用可选的查询参数

Pav*_*vel 13 .net f# c#-to-f# asp.net-web-api

我正在使用F#ASP.NET模板将C#webapi项目转换为F#.除了可选的查询参数,一切都很好.我一直收到这个错误

{
    "message": "The request is invalid.",
    "messageDetail": "The parameters dictionary contains an invalid entry for parameter 'start' for method 'System.Threading.Tasks.Task`1[System.Net.Http.HttpResponseMessage] GetVendorFiles(Int32, System.Nullable`1[System.DateTime])' in 'Thor.WebApi.VendorFilesController'. The dictionary contains a value of type 'System.Reflection.Missing', but the parameter requires a value of type 'System.Nullable`1[System.DateTime]'."
}
Run Code Online (Sandbox Code Playgroud)

F#功能签名:

[<HttpGet; Route("")>]
member x.GetVendorFiles( [<Optional; DefaultParameterValue(100)>] count, [<Optional; DefaultParameterValue(null)>] start : Nullable<DateTime> ) =
Run Code Online (Sandbox Code Playgroud)

C#函数签名:

[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> GetVendorFiles(int count = 100,DateTime? start = null)
Run Code Online (Sandbox Code Playgroud)

有谁知道任何变通方法?

更新: 我找出了这个问题的原因.ASP.NET 使用ParameterInfo提取控制器操作的默认值.显然,F#编译器不会像C#一样编译默认值(即使使用DefaultParameterValueAttribute)

什么是最好的方法或解决这个问题?我需要注入或实现自己的过滤器ParameterBinding吗?

Chr*_*son 3

看起来你几乎只能使用变通办法。

使用怎么样:

[<HttpGet; Route("")>]
member x.GetVendorFiles(count: Nullable<int>, start : Nullable<DateTime>) =
    let count = count.GetValueOrDefault(100)
    // or: let count = if count.HasValue then count.Value else 100
Run Code Online (Sandbox Code Playgroud)