Asp.net web api 控制器未过滤DotNetNuke模块中Breeze查询中的数据

Asp.net web api 控制器未过滤DotNetNuke模块中Breeze查询中的数据,asp.net-web-api,dotnetnuke,breeze,Asp.net Web Api,Dotnetnuke,Breeze,我试图在DotNetNuke模块中包含基本的Breeze示例(它在独立的WebAPI项目中运行良好)。为了简化操作,我删除了客户端,只参考我在Chrome浏览器中进行的URL JSON调用 我可以看到我的元数据和完整的项目列表,例如: 但是,当我尝试从URL中筛选列表时,它总是返回完整的列表,例如。 我认为这与我宣布马普特鲁特岛的方式有关。问题是DotNetNuke模块没有Global.ascx。我已将BreezeWebApiconfig.cs文件复制到我的App_Start文件夹中,当我调

我试图在DotNetNuke模块中包含基本的Breeze示例(它在独立的WebAPI项目中运行良好)。为了简化操作,我删除了客户端,只参考我在Chrome浏览器中进行的URL JSON调用

我可以看到我的元数据和完整的项目列表,例如:

但是,当我尝试从URL中筛选列表时,它总是返回完整的列表,例如。

我认为这与我宣布马普特鲁特岛的方式有关。问题是DotNetNuke模块没有Global.ascx。我已将BreezeWebApiconfig.cs文件复制到我的App_Start文件夹中,当我调试时会触发此操作,但是DotNetNuke使用注册路由的机制:

使用DotNetNuke.Web.Api;
命名空间SmartThinker.Modules.Framework
{
公共类路由映射器:IServiceRouteMapper
{
公共无效注册表项(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute(“框架”、“BreezeApi”、“breeze/{controller}/{action}”、新[]{“SmartThinker.Modules.framework.Controllers”});
}
}
}
我已经读过了,但似乎这与DNN注册路线的方式有关。在不使用BreezeWebApiConfig.cs的情况下,是否仍可以执行此操作

我的控制器代码具有BreezeController属性。(当我将示例客户端连接到它时,我会得到一个项目列表-它只是不过滤,所以我认为这是OData操作过滤器的问题。我如何调试问题所在

更新1) 以下是元数据:

GetUsers方法:

以及试图通过UserID进行过滤的GetUsers方法(这不起作用,这是问题所在) (返回IQueryable)

这是控制器:

[BreezeController]
公共类控制器:DnnApiController
{
私有只读EFContextProvider contextProvider=新EFContextProvider();
[异名]
[HttpGet]
公共HttpResponseMessage元数据()
{
var response=Request.CreateResponse(HttpStatusCode.OK,contextProvider.Metadata());
返回GetResponseWithCorsHeader(响应);
}
[异名]
[HttpGet]
公共HttpResponseMessage GetUsers()
{
var userInfoController=new userInfoController();
var response=Request.CreateResponse(HttpStatusCode.OK,userInfoController.GetUsers());
返回GetResponseWithCorsHeader(响应);
}
[异名]
[HttpGet]
公共IQueryable GetUsersWithoutCors()
{
返回contextProvider.Context.Users;
}
}

路由问题并非易事。服务器如何将请求路由到控制器取决于您。我们开箱即用的方法只是无数方法中的一种

控制器上有
[BreezeController]
属性是吗?你能把一个端点样本放在我们能找到的地方吗。可能会从中得到一些线索。也张贴控制器。一个小小的例子就可以了。。。返回元数据的东西和返回IQueryable的方法

2013年6月25日更新 我认为您在我们的
[BreezeController]
发现返回
IQueryable
的方法时发现了一个bug

[BreezeController]
属性扫描Web API控制器方法,并(实际上)将
[BreezeQueryable]
属性应用于返回
IQueryable
的方法

[BreezeQueryable]
是Web API的
[Queryable]
的扩展,它增加了对$select、$expand和嵌套$orderby的支持。。。当前
[Queryable]
中缺少所有内容

现在我看到您的
GetUsers()
方法返回的是
HttpResponseMessage
而不是
IQueryable
。假设方法中的
userInfoController.GetUsers()
方法返回
IQueryable
。否则,OData查询参数将不适用,我们将不得不采取不同的方向。继续前进

我使用Breeze.WebApi.dll的v.1.3.6进行了检查,它没有检测到
HttpResponseMessage
正在包装
IQueryable
。因此,它不应用客户机的OData查询条件(或任何其他OData修饰符)。这个缺点(在我看来)是一个缺陷。以下应为等效实现:

[HttpGet]
公共可查询待办事项(){
返回_repository.Todos;
}
[HttpGet]
公共HttpResponseMessageToDosWrapped()消息
{
return Request.CreateResponse(HttpStatusCode.OK,_repository.Todos);
}
第二个“wrapped”方法不考虑OData查询参数

幸运的是,在我们解决这个问题之前,还有一个解决办法。只需显式添加
[BreezeQueryable]
属性即可。。。例如:

[HttpGet]
[轻松可查询]
公共HttpResponseMessageToDosWrapped()消息
{
return Request.CreateResponse(HttpStatusCode.OK,_repository.Todos);
}
我确认这种方法确实有效

谢谢你找到这个

使用OData查询语法 一位同事还注意到,您的查询URL没有使用OData查询语法。你写道:

... /todos?=DareId%20eq%204 ... /todos?=DareId%20eq%204 应该是什么时候

... /todos/?$filter=DareId%20eq%204 ... /todos/?$filter=DareId%20eq%204
确保你使用了
?$filter=

谢谢你的病房,我今晚会把它放在一起,然后贴上去!好的,这里是公共webApi:1)元数据Get Users方法-然后这里是不起作用的-尝试在UserID上过滤它-我用控制器和一些live服务更新了我的原始帖子。我想这与路线登记有关。嗨,沃德,我在上面挂了一个端点-请告诉我,如果你能发现我可能会出问题的地方-谢谢你,直到下周,罗德尼。也许其他人可以同时处理。很抱歉