3

私は現在、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);
        }
    }
}

現在、次のような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そのために、前述のクラスにクエリインターセプターを実装しようとしました。

[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

この特定のエラーにより、何らかの理由で、実装したクエリインスペクターから返されるデータは、インターセプターを実装する前のクエリのようにJSONで送信されるのではなく、XMLで送信されると推測しました。

私はこれに関する指示を見つけることができませんでした。クエリインターセプターでJSON応答動作を強制するにはどうすればよいですか?

4

2 に答える 2

6

クエリインターセプターの使用法については、次を参照してください:http: //msdn.microsoft.com/en-us/library/dd744842.aspx

上記でサービスが開始されても驚いています(サービスが開始されない可能性があり、エラーペイロードが返されるため、読み取りに失敗します。たとえば、Fiddlerで確認してみてください)。

クエリインターセプターは、実行前にクエリに追加された述語(Expression)を返します。したがって、新しいクエリを返すことはできません。既存のクエリを変更するだけです。

上記のサンプルでは、​​次のように変更します。

[QueryInterceptor("Entities")]
public Expression<Func<Entity,bool>> OnQueryFares()
{
    return e => DataCheck(e);
}
于 2012-06-21T09:25:01.163 に答える
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 ;
}
于 2013-08-11T01:13:33.570 に答える