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

本文关键字:拒绝 CORS 请求 应用程序 SignalR | 更新日期: 2023-09-27 18:08:49

我正在开发一个MVC 5应用程序,它使用windows服务来执行一些处理;我使用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

我不确定为什么要添加凭据头,但origin头再次让我相信这应该是工作的。

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

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

TL,博士;问题是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();
        }
    }

默认依赖解析器无法解析此问题,因为它需要无参数构造函数。这个回答既指出了正在发生的事情,又为解决方案提供了基础。