【问题标题】:How to use Breeze IQueryable with CORS?如何将 Breeze IQueryable 与 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;
    }

【问题讨论】:

    标签: asp.net-web-api cors breeze


    【解决方案1】:

    我将主要评论您问题的 CORS 方面。关于 $expand 和 $select 的部分在the StackOverflow 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 产品可为您提供所需的所有花里胡哨。
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2021-06-11
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多