我目前在www.mywebsite.com
有一个WCF数据服务。这是一个基本服务,如下所示:
namespace MyWeb
{
[JSONPSupportBehavior]
public class MyDataService : DataService<MyEntities>
{
public static void InitializeService(IDataServiceConfiguration config)
{
config.UseVerboseErrors = true;
config.SetEntitySetAccessRule("Entities", EntitySetRights.AllRead);
ServiceOperationRights.All);
}
}
}
目前,我们有野外客户通过发布ajax调用来发出请求:
$.ajax({
url: serverAddress + "MyDataService.svc/Entities?$top=20&$filter=IsConfirmed%20eq%20null&$format=json&$callback=?",
headers: {
version: "1.0",
platform: "a platform"
},
timeout: 12000,
dataType: 'jsonp',
cache: false,
context: document.body
})
这可以正常工作,返回包含Entities表中所需对象的javascript对象。
但是,我们想在服务器端添加一些智能,以限制从此查询返回的结果。为此,我尝试在上述MyDataService
类中实现Query Interceptor:
[QueryInterceptor("Entities")]
public IQueryable<Entity> OnQueryFares(IQueryable<Entity> query)
{
return from e in query
where DataCheck(e)
select e;
}
目标逻辑是服务现在只返回DataCheck(e)评估为true的表条目。此功能似乎有效。但是,在使用客户端进行测试时,我收到以下错误:
Web Console(4448): Uncaught SyntaxError: Unexpected token < at
http://www.mywebsite.com/MyDataService.svc/Entities?$top=20&$filter=IsConfirmed%20eq%20null&$format=json&$callback=jQuery17207441281890496612_1340223164872&_=1340223166622:1
这个特殊错误导致我猜测,由于某种原因,我实现的查询检查器返回的数据是XML格式,而不是像我在实现拦截器之前的查询那样进入JSON。
我无法找到任何关于此的说明。如何在Query Interceptor中强制执行JSON响应行为?
答案 0 :(得分:6)
有关查询拦截器的使用情况,请参阅此内容:http://msdn.microsoft.com/en-us/library/dd744842.aspx
我很惊讶上面甚至启动了服务(我怀疑它没有,你得到一个错误的有效载荷,因此无法读取它,你可以尝试用例如Fiddler确认)。
Query interceptor返回一个谓词(Expression),它在执行之前被添加到查询中。因此,您无法返回新查询,只需修改现有查询。
在上面的示例中,只需修改它:
[QueryInterceptor("Entities")]
public Expression<Func<Entity,bool>> OnQueryFares()
{
return e => DataCheck(e);
}
答案 1 :(得分:0)
这是扩展版
[QueryInterceptor("Entities")]
public Expression<Func<Entity,bool>> OnQueryFares()
{
// Assuming e has two properties Name and Age.
return e => e.Name=="John" && e.Age=23 ;
}