如何将 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 集合

将 IQueryable 与 Linq 一起使用

C#IQueryable和IEnumerable的区别

.Take() 的行为如何根据我在左侧使用的接口参考发生变化。 IQueryable 与 IEnumerable