2012-10-02 32 views
0

我有一個簡單的WCF數據服務設置。我使用了Linq-to-SQL解決方案。如何添加一個簡單的計數WCF數據服務

public class MyDataService : DataService<SomeDataContext> 
{ 
     public static void InitializeService(DataServiceConfiguration config) 
     { 
      config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); 
      config.SetEntitySetPageSize("*", 20); 
      config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3; 
     } 

由於我使用LINQ,我不得不這樣做增加部分類的鑰匙

[DataServiceKey("MessageId")] 
public partial class Message 
{ 
} 

[DataServiceKey("UserId")] 
public partial class User 
{ 
} 

...

所以我想添加一個原始的方法來獲得特殊用戶誰發了消息。由於Linq aggregate operators, such as count, are not supported,我想出一個體面的解決辦法是創造了count.So我添加了一個方法

[WebGet] 
    public int NumSpecialUsers() 
    { 
     var context = new SomeDataContext(); 
     int numUsers = 
      context.Messages 
      .Where(x => x.special == true && x.UserId != null) 
      .Select(x => x.UserId) 
      .Distinct() 
      .Count(); 

     return numUsers; 
    } 

只讀資源終點,並添加了必要的配置,以InitializeService()

config.SetServiceOperationAccessRule("NumUsers", ServiceOperationRights.AllRead); 

我可以通過localhost:1234/MyDataService.svc/NumSpecialUsers成功調用該方法,但是在localhost:1234/MyDataService.svc中沒有發現此方法。 這看起來不對。通過不在localhost:1234/MyDataService.svc中顯示,這會違反REST,因爲這意味着不可發現的終端。這也意味着當您使用Visual Studio創建OData Linq代理時,它不會在那裏顯示該方法。

我既不是REST | OData | WCF數據服務專家,所以如果有人有這個想法,我很樂意聽到他們。我剛開始對OData和WCF數據服務的冒險,我想採取一種很好的方法來處理事情。非常感謝。

回答

0

問題是,對於在服務文檔中顯示的服務操作,如果服務操作接受參數,url將會是什麼樣子?

我們可以選擇不顯示任何服務操作或僅顯示不採用參數的服務操作 - 我們在一致性方面犯了錯誤,並做出了以前的選擇。

如果您仍然認爲只顯示不帶參數的服務操作會更好,那麼如果我們獲得有關此功能的大量反饋,我希望聽到該參數,甚至進行更改。

謝謝 Pratik

相關問題