刚开始我的第一个 WCF REST 项目,希望得到一些关于使用 REST 的最佳实践的帮助。
我看过很多教程,似乎有很多方法可以做事……例如,如果做一个 POST,我看过一些设置 HttpStatusCodes(OK/Errors 等)的教程,以及其他教程只是返回包含操作结果的字符串。
归根结底,有 4 项操作,当然必须有一个指南,说明如果您正在执行 GET,则以这种方式执行,等等,并且使用 POST,执行此操作...
任何帮助,将不胜感激。
京东
刚开始我的第一个 WCF REST 项目,希望得到一些关于使用 REST 的最佳实践的帮助。
我看过很多教程,似乎有很多方法可以做事……例如,如果做一个 POST,我看过一些设置 HttpStatusCodes(OK/Errors 等)的教程,以及其他教程只是返回包含操作结果的字符串。
归根结底,有 4 项操作,当然必须有一个指南,说明如果您正在执行 GET,则以这种方式执行,等等,并且使用 POST,执行此操作...
任何帮助,将不胜感激。
京东
使用 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 的租户之一,因此无论传输是什么,我们都会将有效负载交给您。
但它忽略的是context/envelope
在许多情况下传输特定的调用 - 所以很多上下文都丢失了。事实上,HTTP 的强大之处在于它的上下文而不是有效负载,并且在早期版本的 WCF 中,没有办法获取客户端的 IP 地址netTcpBinding
,WCF 团队坚持认为他们无法提供它。我现在找不到该页面,但记得阅读评论,MS 家伙刚刚说这不受支持。
使用 WCF REST,您将失去 HTTP 在以下方面清楚地表达自己的灵活性(并且他们后来不得不让步):
新的 Web API,Glenn Block 正在通过在上下文中封装有效负载来解决这个问题:
public HttpResponse<Foo> Do(HttpRequest<Bar> bar) // PSEUDOCODE
{
...
}
但根据我的测试,这并不完美,我个人更喜欢使用 Nancy 之类的框架,甚至是普通的 ASP NET MVC 来公开 Web API。
使用来自HTTP 规范的不同 HTTP 动词时有一些基本规则
GET:这是一个纯读操作。调用不得导致服务中的状态更改。对 GET 的响应可能从缓存(本地、代理等)传递,具体取决于缓存标头
DELETE:用于删除资源
有时在 PUT 和 POST 周围会出现一些混淆 - 应该在什么时候使用?要回答这个问题,您必须考虑幂等性 - 是否可以在不影响服务状态的情况下重复操作 - 例如,将客户名称设置为一个值可以重复多次,而无需进一步更改状态;但是,如果我要增加客户的银行余额,则如果不进一步更改服务的状态,就无法安全地重复此操作。第一个据说是幂等的,第二个不是
PUT:幂等的非删除状态更改
POST:非幂等的非删除状态更改
REST 包含 HTTP - 因此应使用 HTTP 状态代码传达故障。200 表示成功,201 表示创建,服务应该使用 HTTP 位置标头返回新资源的 URI,4xx 是由于客户端请求的性质而导致的失败(因此可以通过客户端更改他们正在执行的操作来修复), 5xx 是服务器错误,只能在服务器端解决
这里缺少一些需要说的东西。
WCF Rest 可能无法提供 REST 协议的所有功能,但它能够为现有的 WCF 服务提供 REST 协议。因此,如果您决定在当前的 SOAP/命名管道协议之上提供某种 REST 支持,那么在 ROI 较低的情况下,这是可行的方法。
手动滚动成熟的 REST 协议可能是理想的,但并不总是经济的。在我 90% 的项目中,REST api 是事后才想到的。Wcf 在这方面非常方便。