我设置了一个简单的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 aggregate operators, such as count, are not supported开始,我认为一个不错的解决方法是为count创建一个只读资源端点。所以我添加了一个方法
[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 :(得分:0)
问题是,要在服务文档中显示服务操作,如果服务操作采用参数,那么网址会是什么样?
我们可以选择不显示任何服务操作或只显示不带参数的服务操作 - 我们在一致性方面犯了错误并做出了前一种选择。
如果你仍然认为只展示不带参数的服务操作会更好,那么我很乐意听到这个论点,如果我们得到很多关于这个功能的反馈,我甚至会做出改变。
由于 PRATIK