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

使用OmniSharp构建C# LSP服务器初始化时报指定JSON-RPC格式错误

排查OmniSharp构建LSP服务器时的JSON-RPC格式错误

你遇到的Message header must separate key and value using ':'错误,本质是LSP消息的HTTP-style头部不符合规范——OmniSharp对LSP的消息格式校验很严格,哪怕头部少个冒号、换行符不对都会触发这个错误。结合你说的初始化后立刻报错、用标准输入输出流的情况,从这几个方向排查:

  • 流读取/写入的编码与缓冲问题
    Console.OpenStandardInput()返回的是字节流,必须用UTF-8编码读取,而且不能手动提前读取流内容——OmniSharp的LanguageServer会自己处理流的读取,如果你在初始化前读了流里的部分数据,会导致头部解析不完整。输出方面,别用Console.WriteLine这类自动加换行的方法,改用StreamWriter直接写入,设置AutoFlush = true避免缓冲导致消息分段,示例代码:

    var outputWriter = new StreamWriter(Console.OpenStandardOutput(), Encoding.UTF8) { AutoFlush = true };
    
  • 消息头部的格式规范
    LSP每个消息必须遵循「头部行 + 空行 + JSON体」的结构,头部必须是Content-Length: 数字的格式,换行必须用\r\n,而且头部结束后必须跟两个\r\n(也就是一个空行)。比如你自己拼接响应的时候,别把Content-Length写成ContentLength(缺冒号),或者只加了一个换行,这些都会触发错误。

  • 初始化响应的格式问题
    初始化是客户端发的第一个请求,OmniSharp处理完后会返回初始化响应,如果这个响应的头部格式错了,客户端立刻会返回错误。重点检查响应的Content-Length计算:必须按UTF-8编码的字节数算,不是JSON字符串的字符数,比如用Encoding.UTF8.GetByteCount(json)而不是json.Length。

  • 抓原始消息内容调试
    最直接的方法是把输入输出的原始字节打印出来,看实际发送/接收的消息头部到底是什么样的。比如在输入流读取前加个代理,把读到的字节转成字符串输出,就能看到是不是客户端发的消息头部有问题,或者自己的响应头部格式不对。

如果用OmniSharp的原生LanguageServer类,尽量别手动干预流的读写,让框架自己处理格式。如果必须自定义输出,严格遵循LSP的消息格式规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:52:37