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的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 MSI 而不是 Service Principal 来调用部署在 Azure 上的 Authenticate web api