我使用一种方法将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;
}
答案 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示例先例进行操作。