8

我正在使用 ASP.NET MVC 4 Web API 创建一个 RESTful Web 服务。对于 API 访问,我将返回 JSON,但一旦我让一切正常工作,默认情况下内容协商应该适用于 XML 和 JSON。

由于我正在努力实现真正以 RESTful 资源为中心的 Web 服务,因此我的 URI 将指向实际资源。如果请求中出现,我想通过返回资源的 HTML 表示来利用这一点Accepts: text/html(比如在浏览器中抛出链接)。

我希望能够利用 MVC 4 Web API 的内容协商为使用 Razor 模板的 text/html 插入渲染器。有没有这样做的工作示例?

是的,这是桥接“常规”MVC 页面和 Web API。基本上我想创建一个渲染器,它使用基于约定的方法来查找和渲染 Razor 视图,就像“常规”MVC 一样。我可以提出基于约定的视图查找逻辑。 我只是在寻找 a)将我的渲染器全局插入text/html到内容协商中,以及b)手动使用 Razor 引擎将我的模型渲染为 HTML。

4

2 回答 2

3

Fredrik Normén 有一篇关于这个主题的博文:

http://weblogs.asp.net/fredriknormen/archive/2012/06/28/using-razor-together-with-asp-net-web-api.aspx

基本上,您需要创建一个MediaTypeFormatter

using System;
using System.Net.Http.Formatting;

namespace WebApiRazor.Models
{
    using System.IO;
    using System.Net;
    using System.Net.Http.Headers;
    using System.Reflection;
    using System.Threading.Tasks;

    using RazorEngine;

    public class RazorFormatter : MediaTypeFormatter
    {
        public RazorFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xhtml+xml"));
        }

        //...

        public override Task WriteToStreamAsync(
                                                Type type,
                                                object value,
                                                Stream stream,
                                                HttpContentHeaders contentHeaders,
                                                TransportContext transportContext)
        {
            var task = Task.Factory.StartNew(() =>
                {
                    var viewPath = // Get path to the view by the name of the type

                    var template = File.ReadAllText(viewPath);

                    Razor.Compile(template, type, type.Name);
                    var razor = Razor.Run(type.Name, value);

                    var buf = System.Text.Encoding.Default.GetBytes(razor);

                    stream.Write(buf, 0, buf.Length);

                    stream.Flush();
                });

            return task;
        }
    }
}

然后在 Global.asax 中注册:

GlobalConfiguration.Configuration.Formatters.Add(new RazorFormatter());

上面的代码是从博客文章中复制的,不是我的工作

于 2012-08-02T18:46:20.960 回答
0

你可以看看WebApiContrib.Formatting.Razor。它与 Kyle 的答案非常相似,但它是一个成熟的开源项目,具有更多功能、单元测试等。您也可以在 NuGet 上获得它

我会说它肯定需要更多功能,但他们似乎设计得很好,所以很容易为它做出贡献。

于 2014-01-30T23:21:27.653 回答