【问题标题】:SignalR CORS on Azure Mobile Services Web ApiAzure 移动服务 Web Api 上的 SignalR CORS
【发布时间】:2014-06-04 09:52:28
【问题描述】:

我有一个运行 Web Api 和 c# 的 Azure 移动服务,并按照Enable CORS on Azure Mobile Serivce .NET Backend 中的建议启用了 CORS 但是我现在已经开始将 SignalR 添加到组合中。

SignalR 工作正常,但我看不到如何启用 CORS。

目前在我的测试应用配置中,我有以下内容:

//enable CORS for WebAPI
var cors = new EnableCorsAttribute("*", "*", "*");
httpconfig.EnableCors(cors);
//rather than use the static method new up SignalRExtensionConfig and pass the current config, hopefully allowing CORS...
var signalRConfig = new SignalRExtensionConfig();
signalRConfig.Initialize(httpconfig, ioc);

但是 CORS 不适用于 SignalR 集线器,它仅适用于 WebAPI :( 我感到沮丧:

请求中没有“Access-Control-Allow-Origin”标头 资源。因此不允许访问 Origin 'null'。

我检查了响应标头,可以确认没有发回任何内容。

谁能给点建议?

【问题讨论】:

    标签: c# asp.net azure signalr azure-mobile-services


    【解决方案1】:

    我正在使用下面的代码在我的 WebAPI 项目中将 CORS 添加到 SignalR。但它不在移动服务中运行。不确定这是否有帮助。

    公共类启动 { 公共无效配置(IAppBuilder 应用程序) { app.Map("/signalr", 地图 => { // 设置 CORS 中间件在 SignalR 之前运行。 // 默认情况下,这将允许所有来源。你可以 // 通过以下方式配置源集和/或 http 动词集 // 提供具有不同策略的 cors 选项。 map.UseCors(CorsOptions.AllowAll); var hubConfiguration = 新的 HubConfiguration { // 您可以通过取消注释下面的行来启用 JSONP。 // JSONP 请求是不安全的,但一些较旧的浏览器(和一些 // IE 版本)需要 JSONP 才能跨域工作 // EnableJSONP = true EnableJavaScriptProxies = false }; // 运行 SignalR 管道。我们没有使用 MapSignalR // 因为这个分支已经在“/signalr”路径下运行。 map.RunSignalR(hubConfiguration); }); } }

    粘贴为答案,因为它在评论中没有多行代码。如果没有帮助请忽略。

    【讨论】:

    • 很遗憾,您无法使用 Azure 移动服务运行自定义启动类,尽管我已将其用于我的其他一些网站,但这是朝着正确方向迈出的一步
    【解决方案2】:

    我找到了一种为 SignalR 启用 CORS 的方法,但它似乎不是“正确”的方法。但在我收到我们的移动服务朋友的回复之前,这足以让我开始开发。

    Azure 移动服务 SignalR NuGet 包包含一个 OwinAppBuilderExtension 类。此类在启动期间用于扩展 Signalr 的 Owin 设置。然后我将其子类化并覆盖了 ConfigureSignalR 方法。

    在此方法中,您可以访问 IAppBuilder。在这里,我只是添加了 appBuilder.UseCors(CorsOptions.AllowAll);在 base.ConfigureSignalR(appBuilder);

    之前

    现在这远非理想,因为我已为所有内容启用了 CORS,并表示允许所有内容。但是对于开发测试来说,这是可以的,我稍后会提供一个自定义的 CORS 策略。

    最后一步是设置我们的新子类(CORSSignalROwinAppBuilderExtension) 以供我们的服务使用。

    在您的 HttpConfig 设置中

     var configBuilder = new ConfigBuilder(options, (httpconfig, ioc) =>
     {
           ioc.RegisterInstance(new CORSSignalROwinAppBuilderExtension(httpconfig)).As<IOwinAppBuilderExtension>();
     });
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 2013-03-08
      • 2015-07-27
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多