如何在CORS中使用Breeze IQueryable?

时间:2013-07-04 17:13:07

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

我使用一种方法将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 个答案:

答案 0 :(得分:1)

我将主要评论您问题的CORS方面。关于$ expand和$ select的部分在the StackOverflow question to which you refer中解决。简而言之,[Queryable]是Web API属性,它不支持$ expand和$ select。我想你想要[BreezeQueryable]属性。

我不能肯定地说,但我不相信你展示的代码是为Web API实现CORS的正确方法。至少我没见过这样做过。

我知道有两种方法;两者都涉及添加消息处理程序。

首先是我们在Breeze Todo样本中做到的方式;第二个是即将推出的Web API CORS支持。

我们这样做的方式是简单但有效。我们不讨论它,因为我们打算在它到达时遵循批准的Web API方式(很快我希望)。

Todo演示中,查找App_Start / BreezeSimpleCorsHandler.cs 。您只需将其复制到您自己的App_Start文件夹中,除了名称空间外无需任何更改。

然后你的服务器必须调用它。在Todo示例中,我们在 BreezeWebApiConfig.cs 中进行了此操作,但您可以将其放在 Global.asax 或任何属于服务器启动逻辑的任何内容中。

      // CORS enabled on this server
      GlobalConfiguration.Configuration.MessageHandlers.Add(new BreezeSimpleCorsHandler());

碰巧,有人尝试使用即将推出的Web API CORS NuGet软件包......并在Breeze中发现了一个错误。我们必须通过......而且我们会这样做。我们真的希望这样的方式。

在此之前,您可以按照Todo示例先例进行操作。