3

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

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

归根结底,有 4 项操作,当然必须有一个指南,说明如果您正在执行 GET,则以这种方式执行,等等,并且使用 POST,执行此操作...

任何帮助,将不胜感激。

京东

4

3 回答 3

6

更新

使用 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 中,没有办法获取客户端的 IP 地址netTcpBinding,WCF 团队坚持认为他们无法提供它。我现在找不到该页面,但记得阅读评论,MS 家伙刚刚说这不受支持。

使用 WCF REST,您将失去 HTTP 在以下方面清楚地表达自己的灵活性(并且他们后来不得不让步):

  • HTTP 状态码
  • HTTP 媒体类型
  • 电子标签,...

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

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

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

于 2012-01-30T12:31:02.210 回答
6

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

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

DELETE:用于删除资源

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

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

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

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

于 2012-01-30T12:32:01.583 回答
0

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

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

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

于 2012-07-24T04:12:27.180 回答