F# MissingMethodException与Suave&;寓言:远程处理

F# MissingMethodException与Suave&;寓言:远程处理,f#,suave,F#,Suave,是重现问题的最小样本 尝试使用Fable客户端或仅导航到该端点会导致服务器抛出找不到的方法: [ERR] request failed System.MissingMethodException: Method not found: 'Microsoft.FSharp.Collections.FSharpMap`2<System.String,System.Object> HttpContext.get_userState()'. at Fable.Remoting.Suave

是重现问题的最小样本

尝试使用Fable客户端或仅导航到该端点会导致服务器抛出找不到的方法:

[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
[ERR]请求失败
System.MissingMethodException:找不到方法:“Microsoft.FSharp.Collections.FSharpMap`2 HttpContext.get_userState()”。
在Fable.Remoting.Suave.SuaveUtil。setBinaryResponseBody@26-1.调用(单位unitVar)
在F:\workspace\\u work\1\s\src\FSharp\FSharp.Core\async.fs中的Microsoft.FSharp.Control.AsyncPrimitives.CallThenInvoke[T,TResult](异步激活'1 ctxt,TResult result1,FSharpFunc'2 part2)中
在Fable.Remoting.Server.Proxy。makeEndpointProxy@80-10.调用(异步激活'1 ctxt)
位于Microsoft.FSharp.Control.AsyncPrimitives。unitAsync@577.Invoke(AsyncActivation`1 ctxt)在F:\workspace\\u work\1\s\src\fsharp\fsharp.Core\async.fs中:第577行
在节目中。greetFun@12-1.在C:\Users\username\code\test\suavetest\Program.fs中调用(AsyncActivation`1 ctxt)。第12行
位于Microsoft.FSharp.Control.AsyncPrimitives。unitAsync@577.Invoke(AsyncActivation`1 ctxt)在F:\workspace\\u work\1\s\src\fsharp\fsharp.Core\async.fs中:第577行
在F:\workspace\\u work\1\s\src\FSharp\FSharp.Core\async.fs:第105行的Microsoft.FSharp.Control.Trampoline.Execute(FSharpFunc`2 firstAction)中
这几天来,我一直在努力,没有任何进展。使用.Net Core 3.1和.Net 5时也会发生相同的错误


有人知道这可能是什么原因吗?我没有看到Fable.Remoting或Suave的任何公开问题,所以我不得不想象这是我做错了什么?

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

一般来说,除非您正在编写一个用于在NuGet上发布的库,否则您应该完全不要将依赖关系固定在FSharp.Core上。对于应用程序,请始终使用.NET SDK提供的任何内容,您实际上永远不会遇到这些问题

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

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

Test.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>

Exe
net5.0
Program.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
开放系统
开放文雅
打开Fable.Remoting.Server
开放寓言。远程处理。文雅
类型ITestAPI={
测试:异步
}
让greetFun=
异步的{
return“它工作了!”
}
设testAPI={
测试=greetFun
}
让webApp=
Remoting.createApi()
|>Remoting.fromValue testAPI
|>远程处理.withDiagnosticsLogger(打印“%s”)
|>Remoting.buildWebPart
[]
让主argv=
startWebServer defaultConfig webApp
0//返回整数退出代码

在封面下,它使用SDK中的FSharp.Core,版本为4.7.0或更高版本,这使得它与您正在使用的库兼容,并且在运行时也不会出现异常。

啊,我想就是这样。我的fsproj文件引用了Fable.Remoting.Suave和Suave本身。删除Suave引用后,它会按预期工作!