【问题标题】:using asp.net mvc for REST based endpoint将 asp.net mvc 用于基于 REST 的端点
【发布时间】:2010-10-09 01:42:39
【问题描述】:

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

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

有人发现这有什么问题吗?

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

由于没有使用 WCF,我们需要保护服务;但是,我认为我们可以使用表单身份验证来做到这一点。

这样做的好处是,无论客户端请求什么类型的数据,它都通过相同的控制器/模型等...

【问题讨论】:

    标签: .net asp.net asp.net-mvc web-services rest


    【解决方案1】:

    Haack 的解决方案当然不是最好的方法,尽管它是一个很好的起点。

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

    执行此操作的正确方法是查看X-Requested-With HTTP 标头以确定这是否是 XHR 请求。或Content-Type: text/xml XML 请求标头。

    我建议您为REST testing 安装模拟 XHR 请求的 Firefox 插件。 Tamper Data 插件和其他一些插件可以更好地控制测试/调试。 WFetch 是一个直接的原始 HTTP 请求工具,对于测试和调试也是必不可少的。

    我为此写了一个JSON/POX action filter。您只需要使用[JsonPox] 属性装饰您的类或方法,它们将根据客户端自动公开为 JSON 或 XML。

    【讨论】:

    • 我一直在使用 Content-Type 来指示用户希望使用 Xml 还是 Html(今天我实际上只支持 Xml)。我计划让我的控制器选择一个 Html 或 Xml 视图,然后负责将模型转换为结果。我认为这很好用。感谢您的反馈和其他信息。
    【解决方案2】:

    您可能想看看这篇博文和 Phil Haack 的以下讨论:

    http://haacked.com/archive/2009/01/06/handling-formats-based-on-url-extension.aspx

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

    注意:我对 Phil 的帖子发表了评论,但我仍然强烈认为应该采取行动“选择加入”他们支持的渲染方法。通过 HTML 呈现,您可以控制向最终用户显示多少视图数据。 XML/JSON 渲染可能会渲染您传递给视图数据的所有内容,无论您是否希望它公开可见。

    【讨论】:

      【解决方案3】:

      阅读 Haack 的帖子后,关于使用扩展来指示内容类型,我认为最好关闭 Accept Header。对我来说似乎更 Rest'ish,尽管启动浏览器并测试你的 url 有点困难。

      我一起浏览了一篇关于这样做并使用 ModelBinder 从控制器中抽象出 HttpContext 的小博客文章:http://jberke.blogspot.com/2009/03/aspnet-mvc-model-binder.html

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        相关资源
        最近更新 更多