如何将 Breeze IQueryable 与 CORS 一起使用?
Posted
技术标签:
【中文标题】如何将 Breeze IQueryable 与 CORS 一起使用?【英文标题】:How to use Breeze IQueryable with CORS? 【发布时间】:2013-07-02 18:18:46 【问题描述】:我使用一种方法将 CORS 处理程序添加到客户端使用 Breeze 调用的响应中。
你可以在这里阅读更多关于我是如何工作的:Controller not filtering data in Breeze query in DotNetNuke Module
不过,我注意到虽然 $filter 有效,但 $expand 和 $select 却无效。
所以我的问题是:如何使用返回 HttpResponseMessage 类型并仍然使用 Breeze(我需要为 CORS 执行此操作)。
为了证明这一点,我下载并更改了 Todos 示例:
原始方法(作品)
http://example/api/todos/todos?$select=isdone
[HttpGet]
public IQueryable<TodoItem> Todos()
return _contextProvider.Context.Todos;
我使用 CORS 包装器的方法(不展开或选择)
http://example/api/todos/TodosCors?$select=isdone
[HttpGet]
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public HttpResponseMessage TodosCors()
var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<TodoItem>)_contextProvider.Context.Todos);
return ControllerUtilities.GetResponseWithCorsHeader(response);
public static HttpResponseMessage GetResponseWithCorsHeader(HttpResponseMessage response)
response.Headers.Add("Access-Control-Allow-Origin", "*");
return response;
【问题讨论】:
【参考方案1】:我将主要评论您问题的 CORS 方面。关于 $expand 和 $select 的部分在the *** question to which you refer 中解决。简而言之,[Queryable]
是不支持 $expand 和 $select 的 Web API 属性。我想你想要 [BreezeQueryable]
属性。
我不能肯定地说,但我不相信您展示的代码是为 Web API 实现 CORS 的正确方法。至少我没见过这样做的。
我知道有两种方法;两者都涉及添加消息处理程序。
第一个是我们在 Breeze Todo 示例中的做法;第二个是即将推出的 Web API CORS 支持。
我们的做法简单但有效。我们不谈论它,因为我们打算在它到达时推迟到批准的 Web API 方式(我希望很快)。
在 Todo 演示中,查找 App_Start/BreezeSimpleCorsHandler.cs。您可以将其复制到您自己的 App_Start 文件夹中,除了命名空间之外没有任何更改。
然后你的服务器必须调用它。在 Todo 示例中,我们在 BreezeWebApiConfig.cs 中执行此操作,但您可以将其放在 Global.asax 或任何属于服务器启动逻辑的任何内容中。
// 在此服务器上启用 CORS GlobalConfiguration.Configuration.MessageHandlers.Add(new BreezeSimpleCorsHandler());碰巧,有人尝试了 Breeze 与即将推出的 Web API CORS NuGet 包......并在 Breeze 中发现了一个错误。我们必须解决这个问题……而且我们会的。我们真的希望这种方式成为方式。
在此之前,您可以遵循 Todo 示例先例。
【讨论】:
感谢 Ward,我一直在玩 Todos 列表中的 CORS 示例 - 是否有任何理由显示“支持 CORS 的全局消息处理程序(仅限开发)” - 即。这只是一个免责声明还是我真的不应该在生产中使用这种方法(即使它工作正常?)。我最初的问题是试图让 Breeze 工作 dith DotNetNuke,这可能不允许我将代码放在 AppStart 中,这就是我想出动态添加响应标头的原因。今晚我会调查这一切,谢谢! ps - 我在 ASP.NET 中看到了即将推出的 CORS 支持,我正在耐心等待;)我现在理解得更好了。 IQUeryable:所以核心标签不支持扩展和选择(因此不是一个选项),而 BreezeQueryable 支持,所以我需要使用这个 一切都很好,谢谢。我注意到的一件事是,当我使用 [NOTMAPPED] 排除 EF Code First 中的属性时,它反映在 MetaData Controller 调用中(没有提及该字段),但是 IQueryable 列表返回属性(但具有 NULL 值)。这对我来说似乎很奇怪...... 更新:另一种方法(如果使用 DotNetNuke 站点)是使用 web.config - 请参阅这篇文章中的 cmets - inspectorit.com/cms/dotnetnuke-cms/… @Rodney - Todos 示例中的 CORS 支持是多年前的黑客攻击,当时 Web API 提供了自己的 CORS 支持。我的 hack 允许任何客户端在任何端点上进行呼叫。您可能希望在生产过程中更加小心……而 Web API 产品可为您提供所需的所有花里胡哨。以上是关于如何将 Breeze IQueryable 与 CORS 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
实体框架,如何将 IQueryable 与多个 where 转换为 SQL 一起使用?
如何将 Kendo UI Grid 与 ToDataSourceResult()、IQueryable<T>、ViewModel 和 AutoMapper 一起使用?
MongoDB+C#+IQueryable - 有一个字符串数组以及如何在 Where 子句中将其加入 Mongos 集合