我正在使用Dot Net Core 2.0设置一个新的SignalR react应用(“ @ aspnet / signalr”)。我想向SignalR集线器“协商”请求发送自定义标头(如request.headers [“ MyHeader”] =“ Header”)。
我能够连接到集线器并获取数据以响应应用程序。我尝试通过尝试覆盖传递给“ withUrl”的选项中的httpClient来设置自定义标头。
使用此处提供的代码,我得到了错误:“错误:无法完成与服务器的协商:错误:从协商未定义中返回了意外的状态代码”
当从选项中删除httpClient时,它将连接。
import { HubConnectionBuilder } from '@aspnet/signalr';
const options = {
accessTokenFactory: () => {
return "jwt token";
},
httpClient: {
post: (url, httpOptions) => {
httpOptions.headers = {
...httpOptions.headers,
MyHeader: "NewHeader"
};
httpOptions.method = "POST";
httpOptions.url = url;
return httpOptions;
}
}
};
const connection = new HubConnectionBuilder()
.withUrl("https://localhost:5001/chatHub", options)
.build();
connection.start().catch(function(err) {
console.log("Error on Start : ", err);
});
我将标头视为“ Authorize”:“ jwt token”的方式,我希望在“ https://localhost:5001/chatHub/negotiate”请求中看到另一个标头为“ MyHeader”:“ NewHeader”
答案 0 :(得分:0)
找到了答案。
httpClient.post覆盖默认SignalR httpClient.post的响应。
以下对httpClient的更新有效。
httpClient: {
post: (url, httpOptions) => {
const headers = {
...httpOptions.headers,
MyHeader: "MyHeader"
};
return axios.post(url, {}, { headers }).then(response => {
return (newResponse = {
statusCode: response.status,
statusText: response.statusText,
content: JSON.stringify(response.data)
});
});
}
}
SignalR“协商”期望以这种形式进行响应。
{
statusCode: 200,
statusText: "ok",
content: "<string response>"
}