【问题标题】:WCF Rest - what are the best practices?WCF Rest - 最佳实践是什么?
【发布时间】:2012-01-30 12:11:10
【问题描述】:

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

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

归根结底,有 4 种操作,而且肯定有一个指南,说明如果您正在执行 GET,请以这种方式执行,等等,如果使用 POST,请执行此操作...

任何帮助将不胜感激。

京东

【问题讨论】:

  • REST 最佳实践:不要使用 WCF REST。像瘟疫一样避免它。

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


【解决方案1】:

更新

使用 ASP.NET Web API。


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

WCF 的一个基本缺陷是它只关注Payload。例如Foo 和Bar 是这里的有效载荷。

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

这是 WCF 的租户之一,因此无论 transport 是什么,我们都会将 payload 交给您。

但它忽略的是调用的context/envelope,在许多情况下是特定于传输的——所以很多上下文都丢失了。事实上,HTTP 的强大之处在于它的上下文而不是有效负载,并且在 WCF 的早期版本中,无法在netTcpBinding 中获取客户端的 IP 地址,WCF 团队坚持认为他们无法提供它。我现在找不到该页面,但记得阅读 cmets 和 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。

【讨论】:

  • 在内容类型协商、JSONP 和 OData 支持等方面,REST 中的其他问题通常不会影响传统的 Web 应用程序,您可能不得不在 MVC 中手动滚动(不确定 Nancy 是我没有使用它)内置在 Web API 中
  • @RichardBlewett ASP NET MVC 不仅仅用于构建传统的 Web 应用程序。
  • @Aliostad : :) 现在我更困惑了。我认为回复会像理查兹,这将是设置 StatusCodes 等的情况。我们即将开始一个 WCF 项目,你会说使用 ASP.net MVC 而不仅仅是 WCF Rest(即使没有意见和我们只是返回 JSON 数据)?
  • servicestack.net 看起来像是 WCF 的一个严肃/更好的替代方案。与 asp.net mvc 配合使用。
  • @JD 现有基础设施我的意思是当前的 .NET 4.0 位 - 在简单的情况下可用,但如果您想要更全面地接受 HTTP 并且想要开箱即用地支持常见的 REST 习惯用法,那么新的 Web API 绝对值得考虑
【解决方案2】:

使用来自HTTP specification的不同HTTP动词时有一些基本规则

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

DELETE:用于删除资源

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

PUT:幂等的非删除状态变化

POST:非幂等的非删除状态变化

REST 包含 HTTP - 因此应使用 HTTP 状态代码传达故障。 200 表示成功,201 表示创建,服务应该使用 HTTP 位置标头返回新资源的 URI,4xx 是由于客户端请求的性质而导致的失败(因此可以通过客户端更改他们正在执行的操作来修复), 5xx 是服务器错误,只能在服务器端解决

【讨论】:

  • 感谢您的信息。我需要重新考虑 WCF Rest 是否是我根据 AlioStads cmets 选择的 f/w。不过,您的意见对我做出决定很有帮助。
【解决方案3】:

这里有一些东西需要说。

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

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

【讨论】:

  • 此外,如果您希望 Wcf REST for HTTP 上下文的上下文感知行为,它是高度可定制的。一个例子是 XML/JSON 切换。 robbincremers.me/2012/01/05/… 这篇文章描述了如何使用 content-type 标头切换格式。再说一次,我同意这并不理想,但也不完全是厄运和悲观。
猜你喜欢
  • 2021-05-12
  • 2014-01-23
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2019-10-21
  • 2019-10-31
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多