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

JD.*_*JD. 3 rest wcf asp.net-web-api

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

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

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

任何帮助,将不胜感激.

JD

Ali*_*tad 6

UPDDATE

使用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)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

public HttpResponse<Foo> Do(HttpRequest<Bar> bar) // PSEUDOCODE
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • @JD by existing infrastructure我的意思是当前的.NET 4.0位 - 可以在简单的情况下使用,但是如果你想要更全面地使用HTTP并且你想要支持开箱即用的常用REST习语,那么新的Web API绝对值得考虑 (2认同)

Ric*_*ett 6

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

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

DELETE:用于删除资源

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

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

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

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