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

时间:2016-08-17 13:51:48

标签: c# angularjs asp.net-web-api typescript signalr

我正在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”标头。最让我烦恼的是,协商请求和中止请求都包含标题

协商请求

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

响应标题

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

响应标题

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==?=

这是我的启动课程

[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天,但我找不到。由于我不熟悉webAPI和HtmlRequest,我可能会错过一些明显的东西。如果没有,那么任何提示/想法/答案将不胜感激。如果遗漏了任何内容,请告诉我,我会尽快添加。

1 个答案:

答案 0 :(得分:0)

感谢Holly有一个similar problem,但我太笨了,无法正确搜索