RESTful Web服务

时间:2010-07-21 18:54:15

标签: c# .net wcf .net-4.0

我是RESTful Web服务的新手。我们采用REST方式构建我们的公共Web服务,供客户使用。我有几个问题。

纯REST网站服务是否存在任何限制?如果是,那么混合REST Web服务会处理这些限制吗?

我正在考虑在授权标头中使用SSL +哈希消息身份验证代码(HMAC)以实现安全性以及基于IP的过滤。你们怎么看待它?

有没有好的客户端测试工具? 目前我正在使用以下内容 http://code.google.com/p/rest-client/

那么客户端代码生成工具呢?

以下链接是我的信息来源。

http://msdn.microsoft.com/en-us/library/dd203052.aspx

http://blogs.msdn.com/b/endpoint/archive/2010/01/07/getting-started-with-wcf-webhttp-services-in-net-4.aspx

3 个答案:

答案 0 :(得分:7)

首先要记住的是REST服务应该是无状态的,与SOAP / RPC类型的服务接口相比,这是非常不同的。使用REST方法需要您重新考虑您希望客户端与服务交互的方式,将交互分解为简洁明了的方法调用。

REST
+轻量级消息,开销很小(除了XML本身)
+易于阅读的结果,可以使用网络浏览器轻松测试
+易于实施
- 松散的界面,松散的类型检查

SOAP
+更严格,具有严格的合同定义
+提供大量开发工具。

通过WCF MSDN文档,从一开始就集成了WCF SOAP支持,而REST支持是最近添加的功能。我自己很难找到REST服务的身份验证/安全性文档,因为大多数文档都是针对SOAP的。

客户端生成工具:我没有遇到任何REST服务,因为REST没有像SOAP那样定义服务契约。 WADL尝试为REST服务执行此操作。 http://en.wikipedia.org/wiki/Web_Application_Description_Language http://wadl.codeplex.com/

我很有兴趣阅读更多关于身份验证和安全性的回复,因为我自己正在调查。

答案 1 :(得分:5)

这是WCF REST WebService的一个很好的起点:

REST / SOAP endpoints for a WCF service

(顺便说一下:Stackoverflow有很好的REST类网址。) 您只需使用Web浏览器即可测试REST服务(转到URL并获取XML或JSON)。 Fiddler也是很好的工具,也是FireFox的FireBug插件。我通常会创建一个瘦服务接口项目和一个单独的(经过单元测试的)逻辑项目。

对于身份验证,我首先会生成一个Guid和一个时间戳。然后基于那些哈希(.NET支持SHA256和SHA512)。 Guid可以存储到服务器(数据库表)以映射它一些具体的数字id。然后你可以有一个像以下的休息网址:

/myobject/1?timestamp=20100802201000&hash=4DR7HGJPRE54Y 

并禁用哈希&时间戳检查开发环境(例如使用AOP)。有了时间戳,我会检查邮票是否在15分钟之前和之后(=应该足以防止攻击)。

您的服务是否对公众/互联网可见,您的客户是jQuery还是Silverlight客户端?然后,您仍然遇到问题:您不希望在客户端软件代码中包含密钥。

所以你需要在服务器和某种cookie中生成哈希来存储客户端会话。 (这可以通过例如在具有不同配置文件的文件夹中使用单独的登录页面/应用程序来完成。)我记得this book确实有关于该主题的内容:

如果要在使用WCF时启用HttpContext,则需要在<serviceHostingEnvironment aspNetCompatibilityEnabled="true">下设置<system.serviceModel>。 然后,您可以从HttpContext.Current.User.Identity.Name检查当前用户身份。

但是,如果您想创建一个纯REST服务,那么您不会使用cookie,而是为每次调用使用HTTP基本身份验证和SSL / TLS。

我认为使用LINQ2Xml或jQuery创建客户端很容易,因此可能不需要客户端生成。

或者您也可以同时拥有SOAP和REST接口,并使用服务引用来创建客户端。

答案 2 :(得分:0)

要记住的一件事是你可以把REST作为一种哲学(一切都应该通过一个干净的URL可以访问,没有附加隐藏的字符串)或作为教条(你必须使用PUT和DELETE即使这意味着一个很多艰难的事情。)

重点在于简化 - 就像使用简单数据类型的参数而不是结构化的堆积,也不是因为多余的原因(例如在网址中拖曳巨型页面“标题”)而不是使用标题,而不是使用不为人知的标题和de - 事件标准。

因此,您可以使用GET设计完美的RESTful界面,并保持Web浏览器的可用性和可测试性。根据您的实际目标受众,您还可以使用任何标准身份验证方法或其中一些方法来实现冗余。如果您要在具有标准化凭据和令牌的企业网上运行应用程序,则可以继续使用该应用程序。如果您正在为非常一般的访问做一些事情,您可以使用GET args和/或cookie的组合 - 保持您的URL清理99.99%的用户。

您甚至可以同时提供JSON和XML(例如Google地图),但仍然是RESTfull,但您不能使用全尺寸SOAP(复杂输入类型等)。你可以为请求做有限的SOAP - 简单类型,总是可以表达为GET args,人们仍然可以获得文档的WSDL。

希望这能够提供足够灵活的图像 - 超越任何严格教条的思维方式。