将字符串列表传递给 F# asp.Net api
Passing string list to F# asp.Net api
其实我发帖前就解决了我的问题,但不知道有没有更好的解决办法?
另外,如果有什么地方可以按原样使用列表?
如果 F# 需要接受字符串列表作为参数,我正在编写一个简单的 get 端点。
我将该列表作为按预期运行的查询的输入,我不担心那部分。
我面临的问题如下(最小实现):
当我将端点定义为:
[<HttpGet>]
member _.Get() =
processStrings [ "test"; "test2" ]
它 returns 符合预期。
当我把它改成:
[<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# 的列表(可变与不可变)。但是有没有办法在 [FromQuery] 参数中使用 F# 列表? [FromBody] 会起作用吗? (没有经过测试的答案)有没有办法为这样的端点添加类型提供程序?
我还遗漏了什么吗?我的现在可以用了,但我很好奇上面的含义。
我没有对此进行测试,但我认为 ASP.NET 不支持 F# 列表作为参数。我猜想将参数作为数组更有可能起作用:
[<HttpGet>]
member _.Get([<FromQuery>] stringList: string[]) =
processStrings (List.ofArray stringList)
其实我发帖前就解决了我的问题,但不知道有没有更好的解决办法? 另外,如果有什么地方可以按原样使用列表?
如果 F# 需要接受字符串列表作为参数,我正在编写一个简单的 get 端点。
我将该列表作为按预期运行的查询的输入,我不担心那部分。
我面临的问题如下(最小实现):
当我将端点定义为:
[<HttpGet>]
member _.Get() =
processStrings [ "test"; "test2" ]
它 returns 符合预期。
当我把它改成:
[<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# 的列表(可变与不可变)。但是有没有办法在 [FromQuery] 参数中使用 F# 列表? [FromBody] 会起作用吗? (没有经过测试的答案)有没有办法为这样的端点添加类型提供程序?
我还遗漏了什么吗?我的现在可以用了,但我很好奇上面的含义。
我没有对此进行测试,但我认为 ASP.NET 不支持 F# 列表作为参数。我猜想将参数作为数组更有可能起作用:
[<HttpGet>]
member _.Get([<FromQuery>] stringList: string[]) =
processStrings (List.ofArray stringList)