微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将字符串列表传递给 F# asp.Net api

如何解决将字符串列表传递给 F# asp.Net api

其实我在发帖之前就解决了我的问题,但是不知道有没有更好的解决方案? 另外,如果有什么地方可以按原样使用列表?


如果 F# 需要接受字符串列表作为参数,我正在编写一个简单的 get 端点。

我将该列表作为按预期运行的查询的输入,我并不担心那部分。

我面临的问题如下(最小实现):

当我将端点定义为:

    
[<HttpGet>]
member _.Get() =
  processstrings [ "test"; "test2" ]

它按预期返回。

当我将其更改为:

[<HttpGet>]
member _.Get([<FromQuery>] stringList: string list) = processstrings stringList

我收到一个错误

InvalidOperationException: 无法创建类型为 'Microsoft.FSharp.Collections.FSharpList`1[[System.String,System.Private.CoreLib,Version=5.0.0.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e]]' 的实例.模型绑定复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。记录类型必须有一个主构造函数。或者,给 'stringList' 参数一个非空的认值。

这对我来说没有多大意义,因为我使用的是字符串列表,在 C# 中至少认为空列表。

所以我认为这归结为 C# 和 F# 如何解释这些签名,但我不确定如何解决它。

我尝试了这个签名并收到与上面相同的错误....

member _.Get( [<Optional; DefaultParameterValue([||]); FromQuery>] stringList: string list) = processstrings stringList

最后使用下面的方法确实解决了问题。

member _.Get( [<Optional; DefaultParameterValue([||]); FromQuery>] stringList: string seq) = processstrings stringList

我认为它已经解决了,因为 seq 只是 IEnumerable,然后可推测的列表不只是来自 C# 的列表(可变 vs 不可变)。但是有没有办法在 [FromQuery] 参数中使用 F# 列表? [FromBody] 会起作用吗? (否是经过测试的答案)有没有办法为这样的端点添加类型提供程序?

这里还有什么我遗漏的吗?我的现在可以用了,但我很好奇上述内容的含义。

解决方法

我尚未对此进行测试,但我认为 ASP.NET 不支持 F# 列表作为参数。我猜想将参数作为数组将更有可能起作用:

[<HttpGet>]
member _.Get([<FromQuery>] stringList: string[]) = 
  processStrings (List.ofArray stringList)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。