SignalR 协商成功但在启动请求时失败

SignalR negotiate succesfully but fail at start request

我正在 javascript angularJS 客户端中使用 SignalR 为我们的内部应用程序开发一个聊天应用程序(目前是自托管的)webAPI。这是在跨域连接中。

使用 SignalR 2.2.1

使用 Owin 3.0.1

使用 Angular 1.5.7(如果相关)


我的问题是每当我尝试与集线器建立连接时,

[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: Auto detected cross domain url.jquery.signalR.js:82 
[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: Client subscribed to hub 'chathub'.jquery.signalR.js:82
[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: Negotiating with 'https:    localhost:44361/signalr/negotiateclientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D'.jquery.signalR.js:82 
[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: webSockets transport starting.jquery.signalR.js:82 
[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: Connecting to websocket endpoint 'wss:    localhost:44361/signalr/connect?transport=webSockets&clientProtocol=1…kAIY9w9Q%3D%3D&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=4'.jquery.signalR.js:82 
[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: Websocket opened.

启动请求失败

[08:26:38 GMT-0400 (Est (heure d’été))] SignalR: webSockets transport connected. Initiating start request.
Failed to load resource: the server responded with a status of 500 ()
XMLHttpRequest cannot load https:    localhost:44361/signalr/start?transport=webSockets&clientProtocol=1…D%3D&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&_=1471436795468. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https:    localhost:3000' is therefore not allowed access. The response had HTTP status code 500.

几天来我一直试图找出这个问题,我注意到在启动请求调用中,响应缺少 'Access-Control-Allow-Origin' header。最让我烦恼的是协商请求和中止请求都包含 header

协商请求

Request URL:https:    localhost:44361/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&_=14714    39245326
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:44361

回复Headers

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:https:    localhost:3000
Cache-Control:no-cache
Content-Type:application/json; charset=UTF-8
Date:Wed, 17 Aug 2016 13:07:29 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/10.0
Transfer-Encoding:chunked
X-AspNet-Version:4.0.30319
X-Content-Type-Options:nosniff
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNccmFwaGFlbC5tb3JpblxTb3VyY2VcUmVwb3NcVGVhbXdvcmtTb2x1dGlvblxUZWFtd29yay5BcGlcc2lnbmFsclxuZWdvdGlhdGU=?=

但不是我的开始请求

开始请求

Request URL:https:    localhost:44361/signalr/start?transport=webSockets&clientProtocol=1.5&connectionToken=tR9V6HAxpgmW7r5Ro%2BzJzhUoJdMUcmv7eDv1ZDM%2Fq6yur21LXCZ2Dg1rrNrDGc5VBXQzfanyisyZKOcWNP7SKOl3TsTkBl3luS4I2UnYtdw8biviZ5NtcE1caoXPi3lVHaHs%2FjQnicwGVDlmJdvRzA%3D%3D&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&_=1471439245327
Request Method:GET
Status Code:500 Internal Server Error
Remote Address:[::1]:44361

回复Headers

Cache-Control:private
Content-Type:text/html; charset=utf-8
Date:Wed, 17 Aug 2016 13:08:05 GMT
Server:Microsoft-IIS/10.0
Transfer-Encoding:chunked
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNccmFwaGFlbC5tb3JpblxTb3VyY2VcUmVwb3NcVGVhbXdvcmtTb2x1dGlvblxUZWFtd29yay5BcGlcc2lnbmFsclxzdGFydA==?=

这是我的创业公司class

[assembly: OwinStartup(typeof(Teamwork.Api.Startup))]
namespace Teamwork.Api
{
  public partial class Startup
  {
    public void Configuration(IAppBuilder app)
    {
      ConfigureAuth(app);
      app.Map("/signalr", map =>
      {
        map.UseCors(CorsOptions.AllowAll);
        var hubConfiguration = new HubConfiguration {
        EnableJavaScriptProxies = false,
        EnableDetailedErrors = true};
        map.RunSignalR(hubConfiguration);
      });
    }
  }
}

我的中心

namespace Teamwork.Api.Hubs
  {
  public class ChatHub : Hub
    { 
      public void TransferMessage(string receiver, string message)
      {
         var name = this.Context.User.Identity.Name;
         var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
         context.Clients.Group(name).AddMessage(name, message);
         context.Clients.Group(receiver).AddMessage(receiver, message);
      }

      public override Task OnDisconnected(bool stopCalled)
      {
         var name = this.Context.User.Identity.Name;

         Clients.All.changeStatus(name, 4);
         return base.OnDisconnected(stopCalled);
      }

      public override Task OnConnected()
      {
         var name = this.Context.User.Identity.Name;
         Clients.All.changeStatus(name, 0);
         return Groups.Add(name, name);
      }
   }
}

我使用 angularJS 服务提供商访问它,在我尝试订阅我的集线器之前没有任何问题

服务提供商

class ChatServiceProvider implements IChatServiceProvider {
  baseUrl: string;
  chatHub: HubProxy;

  public setBaseUrl(url: string) {
    this.baseUrl = url;
  }

  public $get(
    $rootScope: fuse.interfaces.IRootScope
  ): IChatService {
    var self = this;
    var connection = $.hubConnection(self.baseUrl);
    var chatHub = connection.createHubProxy("chatHub");
    function initialize(): JQueryPromise<any> {
      connection.logging = true;
      return connection.start();
    };
    return {
      chatHub: undefined,
      initialize: () => {
        return initialize()
      },
    on: function (eventName, callback) {
      chatHub.on(eventName, function (result: any) {
        $rootScope.$apply(function () {
          if (callback) {
            callback(result);
          }
        });
      });
    }
  }
}

控制器

  self.chatService.on("addMessage", function (name: string, message: string) {
  this.addMessage(name, message);
  })

  this.$scope.reply = function (id: string, message: string) {
    this.chatService.chatHub.invoke("transferMessage", id, message);
  }

  this.chatService.initialize()
    .done(function (data: HubProxy) {
      self.chatService.chatHub = data;
      console.log("Connected");
    })
    .fail(function () { console.log("Failed") });

我试图将这段代码添加到我的 Global.asax 文件中,但没有成功:

Context.Response.AppendHeader("Access-Control-Allow-Credentials", "true");
var referrer = Request.UrlReferrer;
if (Context.Request.Path.Contains("/signalr") && referrer != null){

    Context.Response.AppendHeader("Access-Control-Allow-Origin", referrer.Scheme + ":    " + referrer.Authority);
}

我已经为类似的问题寻找了 4 天,我可以找到 none。由于我不精通 webAPI 和 HtmlRequest,我可能错过了一些明显的东西。如果没有,那么 tips/ideas/answers 将不胜感激。如有遗漏,请告诉我,我会尽快补充。

感谢Holly which had a ,但我太笨了,无法正确搜索