0

我有一个简单的 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 数据服务,我想对事情采取一种好的方法。非常感谢。

4

1 回答 1

0

问题是要在服务文档中显示服务操作,如果服务操作带参数,url 会是什么样子?

我们可以选择不显示任何服务操作或仅显示不带参数的服务操作 - 我们在一致性方面犯了错误并做出了前一种选择。

如果你仍然认为只显示不带参数的服务操作会更好,那么我很乐意听到这个论点,如果我们得到很多关于这个特性的反馈,我什至会做出改变。

谢谢普拉蒂克

于 2012-10-02T19:58:58.507 回答