Azure 移动服务 Web Api 上的 SignalR CORS

Posted

技术标签:

【中文标题】Azure 移动服务 Web Api 上的 SignalR CORS【英文标题】:SignalR CORS on Azure Mobile Services Web Api 【发布时间】: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'。

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

谁能给点建议?

【问题讨论】:

【参考方案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>();
 );

希望对你有帮助

【讨论】:

以上是关于Azure 移动服务 Web Api 上的 SignalR CORS的主要内容,如果未能解决你的问题,请参考以下文章

Api 的自定义身份验证 Azure 移动服务

Azure 上的 Google Analytics API

如何使用 MSI 而不是 Service Principal 来调用部署在 Azure 上的 Authenticate web api

移动设备上的 Azure App Service 身份验证问题

微软云服务Azure所有产品简介

微软云服务Azure所有产品简介