代码之家  ›  专栏  ›  技术社区  ›  JoshBerke

对基于REST的端点使用ASP.NET MVC

  •  5
  • JoshBerke  · 技术社区  · 17 年前

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

    我希望客户端请求内容类型。例如,如果他们发送文本/HTML,我会将我的模型呈现为HTML,如果他们请求文本/XML,它会返回XML。我们也可以做JSON。

    有人看到这个问题吗?

    不使用WCF会增加客户端调用服务时的复杂性,因为它们不能自动生成代理;然而,在我的例子中,客户端将是请求HTML的浏览器,或者是处理XML的Java客户端库。

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

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

    3 回复  |  直到 17 年前
        1
  •  3
  •   aleemb    17 年前

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

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

    正确的方法是看 X-Requested-With 确定这是否是XHR请求的HTTP头。或 Content-Type: text/xml XML的请求头。

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

    我写了一篇 JSON/POX action filter 因为你这么做。您只需要用 [JsonPox] 属性,它们将根据客户机自动公开为JSON或XML。

        2
  •  2
  •   Troy    17 年前

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

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

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

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

        3
  •  2
  •   JoshBerke    17 年前

    在阅读了haack的文章之后,关于如何使用扩展来指示内容类型,我认为您最好键入accept头。在我看来,这更像是一种休息,尽管它允许启动一个浏览器和测试你的网址有点困难。

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

    另外,为了响应特洛伊的选择性加入评论,我使用视图来呈现我的模型的XML。这允许我对同一个模型使用不同的XML格式。这是有道理的。如果您需要为不同的客户机支持版本控制或不同的格式,该怎么办?我不喜欢框架自动呈现任何东西的想法。