调用$.connection.hub.stop()时出现MIME类型错误的SignalR求助
$.connection.hub.stop()时的MIME类型错误 我之前也碰到过类似的棘手问题,结合你的配置和报错信息,给你几个针对性的排查和解决方向:
关闭不必要的JSONP配置
你的Startup里开启了EnableJSONP = true,但JSONP主要是为了兼容不支持CORS的旧浏览器跨域场景。如果你的客户端和服务器是同域,或者浏览器支持CORS(现在大部分现代浏览器都支持),建议关闭JSONP:var Configuration = new HubConfiguration { // EnableJSONP = true, 注释掉或者设为false EnableJavaScriptProxies = true, EnableDetailedErrors = true };JSONP的响应是脚本格式,如果服务器返回的内容MIME类型未正确设置,就会触发浏览器的严格MIME检查报错。
检查请求的响应MIME类型
打开浏览器开发者工具的Network标签,触发$.connection.hub.stop()操作,找到对应的SignalR请求,查看它的响应头和返回内容:- 如果返回内容为空,可能是服务器端处理stop请求时出现异常,结合
EnableDetailedErrors = true,可以查看服务器日志或者直接在响应里找错误信息。 - 如果响应的
Content-Type头为空或者不是application/javascript/application/json,需要检查服务器宿主(比如IIS)的MIME类型配置,确保SignalR的请求能返回正确的MIME类型。
- 如果返回内容为空,可能是服务器端处理stop请求时出现异常,结合
确保客户端连接状态正确再调用stop
在调用stop()之前,先判断连接是否处于connected状态,避免在未连接或正在断开时重复调用导致异常请求:if ($.connection.hub.state === $.signalR.connectionState.connected) { $.connection.hub.stop(); }对齐客户端与服务器的SignalR版本
你服务器端NuGet包已更新,但客户端用的是2.2.3版本,可能存在版本不兼容的情况。建议把客户端的jquery.signalR-2.2.3.min.js替换成和服务器端一致的版本(比如服务器如果是2.4.3,就用对应版本的客户端脚本),版本不一致容易引发各种奇怪的兼容性问题。验证CORS配置的完整性
虽然你设置了map.UseCors(CorsOptions.AllowAll),但可以在Network响应头里确认是否存在Access-Control-Allow-Origin: *(或者你的具体域名)、Access-Control-Allow-Methods等头。如果这些头缺失,可能导致浏览器对跨域请求的处理异常,间接引发MIME类型相关的报错。
内容的提问来源于stack exchange,提问作者Michael Samteladze

