自托管 SignalR 应用程序拒绝 CORS 请求

Posted

技术标签:

【中文标题】自托管 SignalR 应用程序拒绝 CORS 请求【英文标题】:Self-Hosted SignalR app refusing CORS requests 【发布时间】:2014-08-06 20:57:15 【问题描述】:

我正在开发一个使用 Windows 服务执行某些处理的 MVC 5 应用程序;我正在使用信号 R,以便我可以显示 Windows 服务是否在 UI 上运行,并允许用户手动开始处理(而不是按计划运行)。

在服务器端我有以下配置:

public class SignalRStartup

    public static IAppBuilder App = null;

    public void Configuration(IAppBuilder app)
    
        app.Map("/signalr", map =>
        
            map.UseCors(CorsOptions.AllowAll);

            var hubConfiguration = new HubConfiguration
            
                EnableDetailedErrors = true,
            ;

            map.RunSignalR(hubConfiguration);
        );
    

这样使用:

SignalR = WebApp.Start<SignalRStartup>(_settings.LoaderServiceUrl);

现在加载器服务的 url 是:http://localhost:8080

然后在客户端:

var adminHubProxy = $.connection.adminHub;
adminHubProxy.client.updateProcessing = function(status) 
    if (status === true) 
        $('#processing').show();
     else 
        $('#processing').hide();
    
;

$.connection.hub.url = 'http://localhost:8080/signalr';
$.connection.hub.start();

$('#startProcessingLink').on('click', function() 
    adminHubProxy.server.startProcessing();
);

如果包含生成的代理的代码很重要:

<script src="http://localhost:8080/signalr/hubs"></script> 

所以我遇到的问题是,当我触发 startProcessing 函数时,服务器会返回此错误消息:

XMLHttpRequest cannot load http://localhost:8080/signalr/send?transport=serverSentEvents&connectionTok…Pp7JqCJOnkJEA%3D%3D&connectionData=%5B%7B%22name%22%3A%22adminhub%22%7D%5D. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. 

从我所做的所有阅读中,我的配置应该通过允许所有 CORS 请求来解决这个问题,但事实并非如此,我不明白为什么。

编辑 经过更多调试后,我提取了协商调用响应的详细信息,并看到以下标头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost

我完全不确定为什么要添加凭据标头,但原始标头再次让我相信这应该可以工作。

【问题讨论】:

【参考方案1】:

我发现了问题,首先错误消息与正在发生的事情完全无关。

TL;DR; 问题是由于我的依赖注入设置,无法在服务器端解析 AdminHub

我正在使用 Castle Windsor 进行依赖注入,最初 AdminHub 看起来像这样:

 public class AdminHub : Hub
    
        private readonly IMyService _myService;

        public AdminHub(IMyService myService)
        
            _myService= myService;
            _myService.OnProcessingUpdate += (sender, args) => UpdateProcessingStatus();
        

        public void UpdateProcessingStatus()
        
            Clients.All.updateProcessing(_myService.IsProcessing);
        

        public void GetProcessingStatus()
        
            Clients.Caller.updateProcessing(_myService.IsProcessing);
        

        public void StartProcessing()
        
            _myService.Process();
        
    

默认依赖解析器无法解决此问题,因为它需要无参数构造函数。 This answer 都用于指出正在发生的事情并为解决方案提供基础。

【讨论】:

以上是关于自托管 SignalR 应用程序拒绝 CORS 请求的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 服务中使用自托管托管 SignalR

具有自托管的 SignalR 客户端服务器应用程序

支持 https 的 Owin 自托管控制台应用程序(无 Web api,无 SignalR)

SignalR 自托管 Windows 服务,监听消息

Cors 向我抛出错误“访问被拒绝”

SignalR 自托管与 WCF 服务和客户端将是桌面用户