如何将自定义标头从React JS客户端传递到SignalR集线器?

时间:2019-01-22 04:21:39

标签: signalr signalr.client asp.net-core-signalr

我正在使用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”

1 个答案:

答案 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>"
}