我有一个简单的 WCF 数据服务设置。我选择了 Linq-to-SQL 解决方案。
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 聚合运算符,我认为一个不错的解决方法是为计数创建一个只读资源端点。所以我添加了一个方法
[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 | 数据 | WCF 数据服务专家,所以如果有人对此有想法,我很想听听他们的意见。我刚刚开始涉足 OData 和 WCF 数据服务,我想对事情采取一种好的方法。非常感谢。