使用asp.net mvc实现基于REST的端点

使用asp.net mvc实现基于REST的端点,.net,asp.net,asp.net-mvc,web-services,rest,.net,Asp.net,Asp.net Mvc,Web Services,Rest,我正在考虑使用ASP.NETMVC作为基于REST的服务的平台。我知道WCF已经建立了对REST服务的支持;但是,我考虑根据请求返回多种类型的数据 我希望客户端请求内容类型。例如,如果他们发送text/html,我会将我的模型呈现为html,如果他们请求text/xml,它会返回xml。我们也可以使用JSON 有人认为这有什么问题吗 不使用WCF可能会在调用服务时增加客户端的复杂性,因为客户端无法自动生成代理;然而,在我的例子中,客户机要么是请求html的浏览器,要么是处理xml的java客户机

我正在考虑使用ASP.NETMVC作为基于REST的服务的平台。我知道WCF已经建立了对REST服务的支持;但是,我考虑根据请求返回多种类型的数据

我希望客户端请求内容类型。例如,如果他们发送text/html,我会将我的模型呈现为html,如果他们请求text/xml,它会返回xml。我们也可以使用JSON

有人认为这有什么问题吗

不使用WCF可能会在调用服务时增加客户端的复杂性,因为客户端无法自动生成代理;然而,在我的例子中,客户机要么是请求html的浏览器,要么是处理xml的java客户机库

由于我们没有使用WCF,我们需要确保服务的安全;但是,我认为我们可以使用表单身份验证来实现这一点


这样做的好处是,无论客户机请求的是哪种类型的数据,都会通过相同的控制器/模型等进行传输

你可能想看看这篇博文和菲尔·哈克的以下讨论:

他的代码使用请求的文件扩展名(.html、.json、.xml)来确定输出,但您也可以轻松地使用Accept编码(或两者都使用)


注意:我在Phil的帖子上留下了一条评论,但仍然强烈地感觉到需要采取行动来“选择”他们支持的渲染方法。通过HTML呈现,您可以控制向最终用户显示多少viewdata。XML/JSON呈现可能会呈现您传递到viewdata中的所有内容,而不管您是否希望它公开可见。

阅读Haack的文章后,关于使用扩展来指示内容类型,我认为最好关闭Accept标头。对我来说似乎更像是休息,尽管启动浏览器和测试你的url有点困难

我浏览了一篇关于执行此操作并使用ModelBinder从控制器中抽象出HttpContext的博客文章:


另外,为了响应Troy的opt-in评论,我使用视图来呈现模型的Xml。这使我可以为同一个模型使用不同的xml格式。这是有道理的。如果您需要为不同的客户端支持版本控制或不同的格式,该怎么办。我不喜欢框架自动渲染任何东西的想法

哈克的解决方案当然不是解决这个问题的最佳方式,尽管这是一个很好的起点

首先,如果您正在使用实体框架(或者决定稍后从Linq切换到SQL),JsonResult将中断,因为它无法使用循环引用序列化对象图(通常是大多数数据模型)。其次,它公开了同一资源的多个端点

正确的方法是查看
X-request-With
HTTP头以确定这是否是一个XHR请求。或者
Content-Type:text/xml
xml的请求头

我建议您安装模拟XHR请求的Firefox插件。TamperData插件和其他一些插件允许更好地控制测试/调试。WFetch是一个简单的原始HTTP请求工具,对于测试和调试来说也是必不可少的


我已经写了一篇文章来说明这一点。您只需要使用
[JsonPox]
属性来修饰类或方法,它们将根据客户机的不同自动显示为JSON或XML。

我一直在使用内容类型来指示用户是否希望XML或Html(今天我实际上只支持XML)。我计划让我的控制器选择Html或Xml视图,然后负责将模型转换为结果。我认为这很有效。感谢您的反馈和其他信息。