使用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()
解决方案
检查并对齐
Microsoft.IO.RecyclableMemoryStream版本- 运行
dotnet list package查看项目中已安装的该包版本,对比FSharp.Control.Websockets(从堆栈可知是调用方)依赖的版本,确保项目引用的版本与之兼容。 - 如果项目未直接引用该包,手动添加兼容版本的引用:
(版本号请根据FSharp.Control.Websockets的实际依赖调整,部分新版本可能需要3.x系列)dotnet add package Microsoft.IO.RecyclableMemoryStream --version 2.3.2
- 运行
清理项目缓存并重建
- 删除项目根目录下的
bin和obj文件夹,避免旧版本程序集残留。 - 执行
dotnet clean && dotnet restore && dotnet build重新构建项目。
- 删除项目根目录下的
验证SAFE栈组件版本兼容性
- 确保Saturn、Giraffe等SAFE栈核心组件已升级到支持.NET 8的最新稳定版本,避免跨版本依赖冲突。
原因分析
这个异常属于程序集版本冲突:FSharp.Control.Websockets组件在运行时需要调用Microsoft.IO.RecyclableMemoryStreamManager.GetStream()无参方法,但项目中引用的Microsoft.IO.RecyclableMemoryStream版本要么没有这个方法,要么方法签名不匹配。通常是因为升级SAFE栈组件时,间接依赖的包版本未同步更新,或者项目手动指定了不兼容的旧版本。
内容的提问来源于stack exchange,提问作者tweega
相关产品推荐
相关产品推荐

