@microsoft/signalr 8.0.7长轮询Content-Type能否配置为application/json?
@microsoft/signalr 8.0.7长轮询请求Content-Type问题解答
问题背景
在@microsoft/signalr 8.0.7版本中,长轮询(longpolling)请求的Content-Type被设置为text/plain,但请求负载(payload)实际为JSON格式:


问题解答
1. 是否应设置为application/json?
并非必须。@microsoft/signalr框架默认将长轮询请求的Content-Type设为text/plain是有意的设计:SignalR的通信协议并非严格遵循标准JSON规范,部分场景下会传输多帧数据或特殊格式内容,text/plain能更好地兼容这类非标准传输需求,避免因严格的JSON格式校验导致通信异常。
2. 若需配置为application/json的方法
如果业务场景确实需要修改Content-Type为application/json,可以通过自定义HttpClient拦截请求来实现,具体步骤如下:
- 继承SignalR的
DefaultHttpClient,重写send方法,针对长轮询的POST请求修改请求头 - 在构建
HubConnection时传入自定义的HttpClient
示例代码:
import { HubConnectionBuilder, DefaultHttpClient } from "@microsoft/signalr"; class CustomHttpClient extends DefaultHttpClient { async send(request) { // 匹配长轮询的POST请求,修改Content-Type if (request.method === "POST" && request.url.includes("/longPolling")) { request.headers.set("Content-Type", "application/json"); } return super.send(request); } } // 构建Hub连接并使用自定义HttpClient const hubConnection = new HubConnectionBuilder() .withUrl("/your-hub-endpoint", { httpClient: new CustomHttpClient() }) .build();
注意:修改
Content-Type后,需确保服务端能正确解析application/json格式的请求。若服务端是ASP.NET Core SignalR,默认已支持该格式;若为自定义服务端,则需适配对应的解析逻辑。
内容的提问来源于stack exchange,提问作者Markus Benz
相关产品推荐
相关产品推荐

