0

是一个可以重现该问题的最小示例。

尝试使用 Fable 客户端或只是导航到http://127.0.0.1:8080/ITestAPI/Test来访问该端点会导致服务器抛出未找到的方法:

[ERR] request failed
System.MissingMethodException: Method not found: 'Microsoft.FSharp.Collections.FSharpMap`2<System.String,System.Object> HttpContext.get_userState()'.
   at Fable.Remoting.Suave.SuaveUtil.setBinaryResponseBody@26-1.Invoke(Unit unitVar)
   at Microsoft.FSharp.Control.AsyncPrimitives.CallThenInvoke[T,TResult](AsyncActivation`1 ctxt, TResult result1, FSharpFunc`2 part2) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\async.fs:line 386
   at Fable.Remoting.Server.Proxy.makeEndpointProxy@80-10.Invoke(AsyncActivation`1 ctxt)
   at Microsoft.FSharp.Control.AsyncPrimitives.unitAsync@577.Invoke(AsyncActivation`1 ctxt) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\async.fs:line 577
   at Program.greetFun@12-1.Invoke(AsyncActivation`1 ctxt) in C:\Users\username\code\test\suavetest\Program.fs:line 12
   at Microsoft.FSharp.Control.AsyncPrimitives.unitAsync@577.Invoke(AsyncActivation`1 ctxt) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\async.fs:line 577
   at Microsoft.FSharp.Control.Trampoline.Execute(FSharpFunc`2 firstAction) in F:\workspace\_work\1\s\src\fsharp\FSharp.Core\async.fs:line 105

我已经为此打了几天的头,没有任何进展。使用 .Net Core 3.1 和 .Net 5 都会发生同样的错误。

任何人都对可能导致这种情况的原因有任何见解?我没有看到有关 Fable.Remoting 或 Suave 的任何未解决问题,所以我不得不想象这是我做错了什么?

4

1 回答 1

1

这看起来像是 FSharp.Core 不匹配问题。您是否依赖于小于 4.7.2 的特定 FSharp.Core 包?

通常,除非您正在编写一个用于在 NuGet 上分发的库,否则您根本应该将您的依赖项固定在 FSharp.Core 上。对于应用程序,始终使用 .NET SDK 提供的任何内容,您几乎不会遇到这些问题。

明确地,FSharp.Core 包引用对于需要担心其包与哪些 F# 版本兼容的库作者来说是一个额外的问题。如果这不是您的要求,那么最好永远不要选择额外的复杂性。

在全新的 .NET 5 控制台应用程序中使用您的示例代码对我有用:

测试.fsproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="Program.fs" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="fable.remoting.suave" Version="4.13.0" />
  </ItemGroup>

</Project>

程序.fs

open System
open Suave
open Fable.Remoting.Server
open Fable.Remoting.Suave

type ITestAPI = {
    Test : Async<string>
}

let greetFun = 
    async {
        return "It works!"
    }

let testAPI = {
    Test = greetFun
}

let webApp  = 
    Remoting.createApi()
    |>Remoting.fromValue testAPI
    |> Remoting.withDiagnosticsLogger (printfn "%s")
    |>Remoting.buildWebPart

[<EntryPoint>]
let main argv =
    startWebServer defaultConfig webApp
    0 // return an integer exit code

在幕后,这使用了 4.7.0或更高版本的 SDK 中的 FSharp.Core ,这使其与您正在使用的库兼容,并且在运行时不会导致异常。

于 2021-02-15T17:27:19.727 回答