gpt4 book ai didi

向 Hub 方法请求时出现 SignalR CORS 错误

转载 作者:行者123 更新时间:2023-12-02 10:27:25 26 4
gpt4 key购买 nike

我只是想让 SignalR 设置来运行 owin 托管,并且我想通过 JavaScript 客户端进行连接。应该很容易吧?我能够快速设置并运行 SignalR 服务器以及连接到服务器的客户端。但是,当在客户端上调用完成回调时,我尝试调用集线器 Send 方法,并在控制台中收到以下错误:

XMLHttpRequest 无法加载 http://localhost:8199/signalr/signalr/send?transport=serverSentEvents&clien …AxBg6iaFwlK50s2DnurE&connectionData=%5B%7B%22name%22%3A%22testhub%22%7D%5D。请求的资源上不存在“Access-Control-Allow-Origin” header 。来源'http://localhost ' 因此不允许访问。响应的 HTTP 状态代码为 500。

这是我的服务器端代码:

    public static IAppBuilder UseService(this IAppBuilder app)
{
log4net.Config.XmlConfigurator.Configure();
app.UseService(NinjectConfig.CreateKernel);
app.UseLogging();
app.UseSignalr();
return app;
}
    internal static IAppBuilder UseSignalr(this IAppBuilder app)
{
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);

var hubConfig = new HubConfiguration {EnableDetailedErrors = true};
map.RunSignalR(hubConfig);
}
);
return app;
}

这是客户端:

    var connection = $.hubConnection('http://localhost:8199/signalr');
var testHub = connection.createHubProxy('testHub');

testHub.on('addMessage', function(name){
console.log(name);
});

connection.start().done(function () {
testHub.invoke('send', 'testName');
}).fail(function (e) {
console.log('Failed to connect');
});
connection.error(function(error){
console.log(error);
});

为什么 CORS 请求适用于开始调用,而不适用于后续的集线器方法调用?

更新:在网络选项卡中,我可以看到有一个调用:http://localhost8199/signalr/negotiate - 此调用有效,并且 CORS header 正在按预期响应

然后会调用:http://localhost:8199/signalr/connect该调用也具有正确的 CORS header 并且有效。

然后有一个电话:http://localhost:8199/signalr/start同样的好事也发生在这里。

最后有一个电话:http://localhost:8199/signalr/send这是失败的调用,并且每个失败消息的 CORS header 为零。

更新:

我也尝试过像这样设置我的客户端:

    $.connection.hub.url = 'http://localhost:8199/signalr';
var proxy = $.connection.testHub;
proxy.client.addMessage = function(name){
console.log(name);
};

$.connection.hub.start()
.done(function () {
console.log($.connection.hub.id);
proxy.server.sendMessage()
.done(function(val){
console.log(val);
});
})
.fail(function (e) {
console.log('Failed to connect');
});

我对此工作没有什么希望,因为我觉得问题出在服务器端。但只是想更新我在这里尝试过的内容。

最佳答案

事实证明,我在浏览器中看到的错误是一个转移注意力的错误。服务器端的 CORS 设置没有问题。我最终在 chrome 控制台中单击了错误中的 url:

XMLHttpRequest 无法加载 http://localhost:8199/signalr/signalr/send?transport=serverSentEvents&clien ...AxBg6iaFwlK50s2DnurE&connectionData=%5B%7B%22name%22%3A%22testhub%22%7D%5D。请求的资源上不存在“Access-Control-Allow-Origin” header 。来源'http://localhost ' 因此不允许访问。响应的 HTTP 状态代码为 500。

这将我带到了 .Net 蓝屏死机,告诉我参数名称不能为空,并且存在空引用异常。

最终证明这是依赖解析器的问题。我们在这个项目中使用 ninject 内核来解决依赖关系。我不知道如果我的集线器类有一个无参数构造函数,SignalR 需要我通知它我的依赖解析器,但它确实需要该信息。以下是我最终所做的:

       app.Map("/signalr", map =>
{
var resolver = new NinjectSignalRDependencyResolver(kernel);
GlobalHost.DependencyResolver = resolver;
map.UseCors(CorsOptions.AllowAll);

var hubConfig = new HubConfiguration { EnableDetailedErrors = true, EnableJSONP = true };
map.RunSignalR(hubConfig);
}

因此,要吸取的教训是单击超链接,可能会出现更深层次的根本错误。

关于向 Hub 方法请求时出现 SignalR CORS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31816725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com