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

pdu*_*sen 3 c# ado.net jsonp wcf-data-services

我目前有一个WCF数据服务www.mywebsite.com.这是一个基本服务,如下所示:

namespace MyWeb
{
    [JSONPSupportBehavior]
    public class MyDataService : DataService<MyEntities>
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.UseVerboseErrors = true;
            config.SetEntitySetAccessRule("Entities", EntitySetRights.AllRead);
            ServiceOperationRights.All);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,我们有野外客户通过发布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
})
Run Code Online (Sandbox Code Playgroud)

这按预期工作,返回包含Entities表中所需对象的javascript对象.

但是,我们希望在服务器端添加一些智能,以限制从此查询返回的结果.为此,我尝试在上述MyDataService类中实现Query Interceptor :

[QueryInterceptor("Entities")]
public IQueryable<Entity> OnQueryFares(IQueryable<Entity> query)
{
    return from e in query 
           where DataCheck(e) 
           select e;
}
Run Code Online (Sandbox Code Playgroud)

目标逻辑是服务现在只返回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
Run Code Online (Sandbox Code Playgroud)

这个特殊的错误导致我猜测,由于某种原因,我实现的查询检查器返回的数据是XML格式,而不是像我在实现拦截器之前的查询那样进入JSON.

我无法找到任何相关说明.如何在Query Interceptor中强制执行JSON响应行为?

Vit*_*SFT 6

有关查询拦截器的使用请参阅此内容:http://msdn.microsoft.com/en-us/library/dd744842.aspx

我很惊讶上面甚至启动服务(我怀疑它没有,你得到一个错误的有效载荷,因此无法读取它,你可以尝试用例如Fiddler确认).

Query拦截器返回一个谓词(Expression),它在执行之前被添加到查询中.因此,您无法返回新查询,只需修改现有查询即可.

在上面的示例中,只需像下面这样修改它:

[QueryInterceptor("Entities")]
public Expression<Func<Entity,bool>> OnQueryFares()
{
    return e => DataCheck(e);
}
Run Code Online (Sandbox Code Playgroud)