2012-06-20 80 views
3

我目前有一個WCF數據服務,生活在www.mywebsite.com。這是一個基本的服務,看起來像這樣:如何使JCF中的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類來實現查詢攔截器:

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

與預期的邏輯是,該服務將現在只返回其DataCheck(E)的計算結果爲真表項。此功能似乎工作。然而,與客戶端進行測試時,我得到以下錯誤:

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。

我一直沒有找到任何指示。我如何在查詢攔截器中執行JSON響應行爲?

+0

你用過提琴手追查請求和響應? – softveda

+0

@Pratik Fiddler似乎認爲有問題的客戶端是臺式電腦,但事實並非如此。 – pdusen

回答

5

看到這個查詢攔截器的用法:http://msdn.microsoft.com/en-us/library/dd744842.aspx

我很驚訝以上,甚至啓動服務(我懷疑它不會和你回來一個錯誤的有效載荷,從而無法讀取它,你可以嘗試與例如Fiddler確認)。

查詢攔截器返回一個謂詞(表達式),它在執行之前添加到查詢中。所以你不會返回一個新的查詢,只是修改現有的查詢。

在上面的示例,只需修改這樣的:

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

非常感謝。這對我有幫助:「查詢攔截器返回一個謂詞(表達式),它在執行之前添加到查詢中,因此您不必返回新的查詢,只需修改現有的查詢即可。」我看過的任何地方都沒有說清楚,所以當我在嘗試使用表達式之前,我是以錯誤的方式去做的。再次感謝! – pdusen

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 ; 
} 
相關問題