asp.net-web-api – 交叉原始SignalR连接在协商后停止
我有一个MVC 5应用程序提供视图,一个Web API 2应用程序作为服务层(.NET 4.5). Web API应用程序使用SignalR 2.1.2在处理POST到服务API时返回进度.这两个部署到不同的域,因此我根据
asp.net教程文章设置了跨源支持.
[assembly: OwinStartup(typeof (Startup))] namespace MyApp.Service { public class Startup { public void Configuration(IAppBuilder app) { app.Map("/signalr",map => { //worry about locking it down to specific origin later map.UseCors(CorsOptions.AllowAll); map.RunSignalR(new HubConfiguration()); }); //now start the WebAPI app GlobalConfiguration.Configure(WebApiConfig.Register); } } } WebApiConfig.cs还包含自己的CORS声明. namespace MyApp.Service { public static class WebApiConfig { public static void Register(HttpConfiguration config) { //controller invocations will come from the MVC project which is deployed to a //different domain,so must enable cross origin resource sharing config.EnableCors(); // Web API routes config.MapHttpAttributeRoutes(); //Snip other controller dependency initialisation } } } 我已经定义了一个没有服务器端API的简单集线器类(它只允许服务器推送到客户端,而不是客户端调用). namespace MyApp.Service.Hubs { [HubName("testresult")] public class TestResultHub : Hub { } } 由于我要跨域并且集线器没有公开任何服务器端API,所以我不打算使用生成的JS代理. 设置信号器集线器连接的JS的相关位是:(记住这是从MVC应用程序提供的,它没有任何信号器支持(当然除了jquery-signalr- {version} .js)) function TestScenarioHandler(signalrHubUrl) { var self = this; //Snip irrelevant bits (mostly Knockout initialisation) self.signalrConnectionId = ko.observable(); var hubConnection = $.hubConnection(signalrHubUrl,{ useDefaultPath: false }); var hubProxy = hubConnection.createHubProxy("testresult"); hubProxy.on("progress",function(value) { console.log("Hooray! Got a new value from the server: " + value); }); hubConnection.start() .done(function() { self.signalrConnectionId(hubConnection.id); console.log("Connected to signalr hub with connection id " + hubConnection.id); }) .fail(function() { console.log("Failed to connect to signalr hub at " + hubConnection.url); }); } 像这样跨越起源,Firefox网络流量显示(我已经确认Chrome显示同样的事情)GET to ?HTTP://****service.azurewebsites.net/signalr/negotiate clientProtocol = 1.5&安培; connectionData = [{ “名称”: “的TestResult”}]&安培; _ = 1424419288550 请注意,该名称与我的集线器类上的HubName属性的值匹配. 此GET返回HTTP 200,响应为我提供了一个JSON有效负载,其中包含ConnectionId,ConnectionToken和一堆其他字段,表明一切正常. HTTP响应还将Access-Control-Allow-Origin:标头设置为GET源自的域.一切都看起来不错,除了交通停止的地方. 但JS控制台打印“无法连接到信号器集线器http://****service.azurewebsites.net/signalr” 为了验证我没有做任何太愚蠢的事情,我已经为MVC应用程序添加了信号器支持和基本集线器(因此不需要交叉源),并相应地更改了$.hubConnection()和hubConnection.createProxy()调用.当我这样做时,浏览器流量显示相同/信号器/协商?… GET(显然不再交叉原点),但是然后GET到/ signalr / connect?…和/ signalr / start?… .JS控制台还会打印成功消息. 总而言之; >在服务层启用CORS,信号器/协商GET返回200,看起来是有效的连接ID,以及预期的Access-Control-Allow-Origin:标头.这向我建议服务器端CORS支持正常运行,但信号器连接不成功. WTF我错过了还是做错了?!也许HttpConfiguration.EnableCors()和IAppBuilder.UseCors(CorsOption)之间存在一些冲突? 解决方法
解决了它.我已经更改了map.UseCors(CorsOptions.AllowAll)来传递CorsPolicy对象,并将SupportsCredentials设置为false,在其他地方读取了Access-Control-Allow-Origin:*与access-control-allow-credentials不兼容:真正.
private static readonly Lazy<CorsOptions> SignalrCorsOptions = new Lazy<CorsOptions>(() => { return new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = context => { var policy = new CorsPolicy(); policy.AllowAnyOrigin = true; policy.AllowAnyMethod = true; policy.AllowAnyHeader = true; policy.SupportsCredentials = false; return Task.FromResult(policy); } } }; }); public void Configuration(IAppBuilder app) { app.Map("/signalr",map => { map.UseCors(SignalrCorsOptions.Value); map.RunSignalR(new HubConfiguration()); }); //now start the WebAPI app GlobalConfiguration.Configure(WebApiConfig.Register); } 将SupportCredentials设置为true会导致在响应中使用实际原点(非*)和access-control-allow-credentials:true重写Access-Control-Allow-Origin标头. 现在它有效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.Net负载均衡
- asp.net – 如何获得Google Prettify更像Visual Studio
- asp.net-core – 如何在aspnet核心应用程序中为静态文件使用
- ASP.net缓存绝对到期不工作
- asp.net三层架构增删改查
- ASP.NET DataReader值
- asp.net-mvc – 如何将我的对象保存回LINQ to SQL中的数据库
- ASP.NET:如果使用onclick,则不会调用OnServerClick事件处理
- asp.net-mvc – 我们应该使用Entity Framework Code First方
- asp.net-mvc – ASP.NET MVC组合下拉框
- 如何使用ASP.NET MVC中的正确密钥向ModelState添
- asp.net-mvc – Url.RouteUrl返回null
- 在ASP.NET中查找重定向的原因?
- asp.net-mvc – 如何跳过ActionFilter的操作执行
- asp.net-mvc-3 – Appharbor URL中的端口号导致页
- ASP.NET Core中实现用户登录验证的最低配置示例代
- asp.net-mvc – 返回局部视图的RedirectToAction
- asp.net-mvc – 如何在没有提示的情况下为Google
- asp.net-mvc-3 – 为什么会话是ASP.NET MVC应用程
- .net中的深拷贝与浅拷贝