WCF休息 - 最佳做法是什么?

时间:2012-01-30 12:11:11

标签: wcf rest asp.net-web-api

刚开始我的第一个WCF休息项目,并希望获得有关使用REST的最佳实践的一些帮助。

我已经看过很多教程,并且似乎有很多方法可以做某些事情......例如,如果做一个POST,我看过一些教程设置HttpStatusCodes(OK / Errors等),以及其他教程,它们只返回包含操作结果的字符串。

在一天结束时,有4个操作,当然必须有一个指南,说明如果你正在做GET,这样做,等等,并使用POST,这样做...

任何帮助都将不胜感激。

JD

3 个答案:

答案 0 :(得分:6)

UPDDATE

使用ASP.NET Web API。


好的,我离开了评论REST best practices: dont use WCF REST. Just avoid it like a plague,我觉得我必须解释一下。

WCF的一个根本缺陷是它只关注 Payload 。例如,FooBar是此处的有效负载。

[OperationContract]
public Foo Do(Bar bar)
{
    ...
}

这是WCF的租户之一,因此无论传输是什么,我们都会将有效负载交给您。

但它忽略的是调用的context/envelope,在许多情况下是特定的传输 - 所以很多上下文都会丢失。实际上,HTTP的功能在于它的上下文而不是有效载荷,而在早期版本的WCF中,没有办法在netTcpBinding中获取客户端的IP地址,WCF团队坚持认为他们无法提供它。我现在找不到页面,但记得阅读评论,而MS人员只是说不支持。

使用WCF REST,您在以下方面明确表达自己(并且他们不得不在以后使用它们)时失去了HTTP的灵活性:

  • HTTP状态代码
  • HTTP媒体类型
  • ETag,...

新的Web API,Glenn Block正在通过将有效负载封装在上下文中来解决这个问题:

public HttpResponse<Foo> Do(HttpRequest<Bar> bar) // PSEUDOCODE
{
    ...
}

但是在我的测试中,这并不完美,我个人更喜欢使用Nancy等框架甚至普通的ASP NET MVC来公开Web API。

答案 1 :(得分:6)

使用来自HTTP specification

的不同HTTP谓词时,有一些基本规则

GET:这是一个纯读操作。调用不得导致服务中的状态更改。对GET的响应可以从缓存(本地,代理等)传递,具体取决于缓存标头

DELETE:用于删除资源

有时会对PUT和POST产生一些混淆 - 应该在什么时候使用?要回答你必须考虑幂等性 - 是否可以在不影响服务状态的情况下重复操作 - 例如,将客户的名称设置为值可以重复多次而无需进一步的状态更改;但是,如果我正在递增客户的银行余额,则无法在不对服务进行进一步状态更改的情况下重复此操作。第一个被认为是幂等的,第二个不是

PUT:幂等的非删除状态更改

POST:非幂等的非删除状态更改

REST包含HTTP - 因此应使用HTTP状态代码传达失败。 200为成功,201为创建和服务应使用HTTP位置标头返回新资源的URI,4xx是由于客户端请求的性质而失败(因此可以通过客户端修改他们正在做的事情来修复), 5xx是服务器错误,只能在服务器端解析

答案 2 :(得分:0)

这里缺少一些需要说的东西。

WCF Rest可能无法提供REST协议的所有功能,但它能够为现有WCF服务提供REST协议。因此,如果您决定在当前的SOAP /命名管道协议之上提供某种REST支持,那么如果ROI较低,则可以采用这种方式。

手动滚动全面的REST协议可能是理想的,但并不总是经济的。在90%的项目中,REST api是事后的想法。在这方面,Wcf非常方便。