如何使WCF数据服务查询拦截器返回JSON结果?

时间:2012-06-20 20:21:22

标签: c# ado.net jsonp wcf-data-services

我目前在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响应行为?

2 个答案:

答案 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 ;
}