将 REST 方法添加到 WCF 数据服务?

Posted

技术标签:

【中文标题】将 REST 方法添加到 WCF 数据服务?【英文标题】:Adding REST methods to WCF Data Services? 【发布时间】:2011-03-26 19:11:09 【问题描述】:

我需要扩展我的 WCF 数据服务以包含其他方法,而不仅仅是数据库表。

但它似乎无法正常工作。

首先我想问一下这是否合法?还是皱眉?

我需要这样做的原因是我需要添加额外的 REST 方法来调用 ASP.NET 成员服务(表在数据库中)以验证登录,即

    public bool IsValidLogin(string username, string password)
    
        return System.Web.Security.Membership.ValidateUser(username, password);
    

这就是我所拥有的(我简化了 IsValidLogin 进行测试)。

    [WebGet(UriTemplate = "TestMe")]
    public bool IsValidLogin()
    
        return true;
    

    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    
        // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        // Examples:
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.SetServiceOperationAccessRule("IsValidLogin", ServiceOperationRights.All);

现在我去

  http://localhost/MyDataAccess/MyService.svc/IsValidLogin

它似乎可以工作,我以 XML 的形式得到了真正的回报。但我已经设置了一个 URI,所以我认为我可以这样做

  http://localhost/MyDataAccess/MyService.svc/TestMe

但它失败了?我真的很困惑,有什么想法吗?

为了让它工作,我需要添加这一行,但这里有点混乱

    config.SetServiceOperationAccessRule("IsValidLogin", ServiceOperationRights.All);

非常感谢任何帮助

【问题讨论】:

你的 web.config 中有什么绑定?为了在 WCF 中支持 SOAP 和 REST,我有两个具有不同绑定的类。 【参考方案1】:

不对上面的 REST 讨论发表评论,只是发布一个关于如何做到这一点的文档链接,称为“服务操作”:http://msdn.microsoft.com/en-us/library/cc668788.aspx

【讨论】:

【参考方案2】:

ServiceOperation 概念是一种附加功能,可在您想做一些事情而不是从表中读取数据时提供所需的转义。

不幸的是,WCF REST 中的默认路径导致您误解了 RESTful 系统应该如何工作。 REST 不仅仅是在 URL 上公开一些数据。

您确实有两个选择,要么坚持使用基于 WS-*/SOAP 的 WCF 提供的分布式计算的 RPC 风格,要么花一些时间了解 REST 的真正含义。有一些链接 here 可以帮助您入门。

我无法告诉您哪种方法适合您的场景。我可以告诉你的是,你不会通过使用当前的 WCF REST 实现来学习如何做 REST。我并不是说不可能做到,只是你会在上游游很多次。

【讨论】:

Darrel,我想我现在已经对 REST 进行了排序,我还有另一个正在处理的项目,一切都很好……我的数据库通过 DataServices 公开。我还需要利用 ASP.NET Membership,它们是数据库中的表(在我的情况下)......所以我想扩展(添加到)我的数据服务项目以包含一些休息方法...... 如果你有更多的 cmets 我在听,但我真的不明白我是怎么错过重点的?你能详细说明吗? WCF Rest 适用于 GET、PUT 等 http 方法。我已将 GET 作为方法放置并返回一些数据.... @mark 如果您尝试进行登录,那么您不是在进行无状态请求。那是一个 REST 约束。如果您在客户端上反序列化对象并将 application/xml 作为媒体类型(WCF)发送,那么您的请求不是自描述的。这是另一个 REST 约束。 IsValidLogin 违反了资源标识约束。我很确定您没有返回超媒体,也没有使用超媒体驱动的客户端,因此 HATEOAS 可能在您的设计目标列表中并不高。老实说,我并不是说你的做法是错误的,只是不要认为它是 REST。 感谢 Darrel 的 cmets,我没有登录。登录在客户端完成,我只是对 Web 服务的请求(在本例中为 REST),REST 返回 XML 天气是否是有效登录名...关于反序列化对象,我并没有真正这样做.. 其余部分返回 XML,我正在使用 .net 类从其余部分返回的 XML 填充 .net 对象。感谢您的 cmets.. 我会尝试进一步调查

以上是关于将 REST 方法添加到 WCF 数据服务?的主要内容,如果未能解决你的问题,请参考以下文章

尝试发布到 wcf rest 4 服务时出现错误请求

将 JSON 数据从 JQuery 发送到 WCF REST 方法时出现问题

如何同时使用 SOAP WCF 服务和 REST API

请求实体太大 WCF REST 服务

Android将文件作为ByteArray上传到WCF REST服务

Jquery Rest 与 WCF 3.5 的通信