You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SAFE栈+Net8.0搭建WebSocket应用遇方法缺失异常

解决.NET 8+最新SAFE栈中WebSocket join函数抛出MissingMethodException的问题

问题现象

两年前基于旧版SAFE栈开发的最小化WebSocket应用运行正常,升级到.NET 8及最新SAFE栈包后,调用join函数时,客户端连接日志能正常输出,但随即抛出System.MissingMethodException,提示找不到Microsoft.IO.RecyclableMemoryStreamManager.GetStream()方法。

相关代码片段:

let channel = channel {
    join (fun ctx socketId ->
        task {
            ctx.GetLogger().LogInformation("Client has connected. They've been assigned socket Id: {socketId}", socketId)
            return Channels.Ok
        })

错误堆栈:

Client has connected. They've been assigned socket Id: { SocketId = 257a9ac9-3325-4269-8a58-a6e2e529fc96 }
server: fail: Giraffe.Middleware.GiraffeErrorHandlerMiddleware[0]
server:       An unhandled exception has occurred while executing the request.
server:       System.MissingMethodException: Method not found: 'System.IO.MemoryStream Microsoft.IO.RecyclableMemoryStreamManager.GetStream()'.  
server:          at FSharp.Control.Websockets.ThreadSafeWebSocket.receiveMessageAsUTF8@664-6.Invoke(Unit unitVar)
server:          at Microsoft.FSharp.Control.AsyncPrimitives.CallThenInvoke[T,TResult](AsyncActivation`1 ctxt, TResult result1, FSharpFunc`2 part2) in D:\a\_work\1\s\src\FSharp.Core\async.fs:line 510
server:          at Microsoft.FSharp.Control.Trampoline.Execute(FSharpFunc`2 firstAction) in D:\a\_work\1\s\src\FSharp.Core\async.fs:line 112    
server:       --- End of stack trace from previous location ---
server:          at Saturn.Channels.Invoke@109.MoveNext()
server:          at Giraffe.Middleware.Invoke@63-1.MoveNext()

解决方案

  1. 检查并对齐Microsoft.IO.RecyclableMemoryStream版本

    • 运行dotnet list package查看项目中已安装的该包版本,对比FSharp.Control.Websockets(从堆栈可知是调用方)依赖的版本,确保项目引用的版本与之兼容。
    • 如果项目未直接引用该包,手动添加兼容版本的引用:
      dotnet add package Microsoft.IO.RecyclableMemoryStream --version 2.3.2
      
      (版本号请根据FSharp.Control.Websockets的实际依赖调整,部分新版本可能需要3.x系列)
  2. 清理项目缓存并重建

    • 删除项目根目录下的bin和obj文件夹,避免旧版本程序集残留。
    • 执行dotnet clean && dotnet restore && dotnet build重新构建项目。
  3. 验证SAFE栈组件版本兼容性

    • 确保Saturn、Giraffe等SAFE栈核心组件已升级到支持.NET 8的最新稳定版本,避免跨版本依赖冲突。

原因分析

这个异常属于程序集版本冲突:FSharp.Control.Websockets组件在运行时需要调用Microsoft.IO.RecyclableMemoryStreamManager.GetStream()无参方法,但项目中引用的Microsoft.IO.RecyclableMemoryStream版本要么没有这个方法,要么方法签名不匹配。通常是因为升级SAFE栈组件时,间接依赖的包版本未同步更新,或者项目手动指定了不兼容的旧版本。

内容的提问来源于stack exchange,提问作者tweega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:17:37