繁体   English   中英

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

[英]How can I make a WCF Data Service Query Interceptor return results in JSON?

我目前在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

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

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

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

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

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

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

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

这是一个扩展版本

[QueryInterceptor("Entities")]
public Expression<Func<Entity,bool>> OnQueryFares()
{
    // Assuming e has two properties Name and Age. 
    return e => e.Name=="John" && e.Age=23 ;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM