【问题标题】:WebAPI SignalR Negotiate response different on different browsersWebAPI SignalR 在不同浏览器上协商响应不同
【发布时间】:2014-01-30 12:29:59
【问题描述】:

我认为关于 Access-Control-Allow-Origin 的主要问题。但是当我按照given documentation 中的定义配置Web API 项目时,它仍然无法在chrome 和firefox 中运行,但在IE 中运行良好(这是关于IE 认为localhost 不是跨域的,AFAIK)。我尝试了不同的方法让它工作,但没有结果。

我把示例项目放到github repository。项目非常简单。有两个应用程序在跨域工作。这是一个非常简单的聊天应用程序,就像在信号器示例中一样。

您必须在客户端 javascript 文件中更改 api host 的值: https://github.com/yusufuzun/WebApiSignalR/blob/master/ChatApp/Scripts/app/chat.js#L2

当你在mvc项目中打开Chat页面时,会有两个对api应用的请求

1- 常规 ajax 请求(工作正常)

2- Signalr 协商请求(已​​取消)

而且我认为浏览器不会禁用 CORS,因为如果它禁用,则不会对服务器造成影响。所以我认为这与浏览器有关,但与浏览器禁用(其他)无关。

详细信息在存储库中 自述文件:https://github.com/yusufuzun/WebApiSignalR/blob/master/README.md 提琴手结果:https://github.com/yusufuzun/WebApiSignalR/blob/master/FiddlerResults

它的坏处也是服务器返回 500 并出现此错误: System.InvalidOperationException: 'chat' Hub 无法解析。

哪个中心名称也是聊天。 https://github.com/yusufuzun/WebApiSignalR/blob/master/ChatApi/Hubs/ChatHub.cs#L10

您可以在项目中以不同的方式为 Web Api 启用 CORS 以进行测试。每一个都给出了关于 XMLHttpRequest Access-Control-Allow-Origin 的不同错误。

我评论了他们,所以你可以取消评论并为每个人做测试:

https://github.com/yusufuzun/WebApiSignalR/blob/master/ChatApi/Global.asax.cs#L24 https://github.com/yusufuzun/WebApiSignalR/blob/master/ChatApi/App_Start/WebApiConfig.cs#L14 https://github.com/yusufuzun/WebApiSignalR/blob/master/ChatApi/App_Start/WebApiConfig.cs#L16 https://github.com/yusufuzun/WebApiSignalR/blob/master/ChatApi/Controllers/ChatController.cs#L17

那么这里发生了什么?

【问题讨论】:

    标签: asp.net-web-api cors signalr-hub signalr.client


    【解决方案1】:

    在我与JabbR 中的David Fowler 交谈后,他提到了将CORS 与SignalR 一起使用的事情。我的信号器启动代码错误。因此,在按照他的建议更改启动代码后,它运行良好。

    他还提到 SignalR 和 Web API 正在使用不同的 CORS 定义。所以启用或禁用一个不会影响另一个。

    这是新的启动代码:

    app.Map("/signalr", map =>
    {
        map.UseCors(CorsOptions.AllowAll);
        map.RunSignalR(new HubConfiguration()
        {
            EnableDetailedErrors = true,
            EnableJavaScriptProxies = true
        });
    });
    

    旧的:

    app.MapSignalR(new HubConfiguration()
    {
        EnableDetailedErrors = true,
        EnableJavaScriptProxies = true
    }).UseCors(CorsOptions.AllowAll);
    

    希望它对那里的人有所帮助。

    【讨论】:

    • 我得到这个输出:...\Startup.cs(14,21,14,28): error CS1061: 'Owin.IAppBuilder' 不包含 'UseCors' 的定义并且没有扩展可以找到接受“Owin.IAppBuilder”类型的第一个参数的方法“UseCors”(您是否缺少 using 指令或程序集引用?) ...\Startup.cs(14,29,14,40):错误 CS0103 : 当前上下文中不存在名称“CorsOptions”
    • 我没有将 nuget 包添加到 github 存储库中。因此,您需要通过包还原首选项重新下载 nuget 包。只需打开添加参考窗口并单击恢复包按钮。
    • 您的旧配置也适用于我 - 只需将 UseCors() 调用 在 MapSignalR() 调用之前放置。
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多