我正在使用 ASP.NET MVC 4 Web API 创建 RESTful Web 服务。对于 API 访问,我返回 JSON,但一旦一切正常工作,内容协商应该默认适用于 XML 和 JSON。
由于我正在致力于实现真正的 RESTful 以资源为中心的 Web 服务,因此我的 URI 将指向实际资源。我想通过返回资源的 HTML 表示来利用这一点,如果Accepts: text/html
出现在请求中(就像将链接扔到浏览器中一样)。
我希望能够利用 MVC 4 Web API 内容协商来插入使用 Razor 模板的文本/html 渲染器。有这样做的可行示例吗?
是的,这是桥接“常规”MVC 页面和 Web API。基本上我想创建一个渲染器,它使用基于约定的方法来查找和渲染 Razor 视图,就像“常规”MVC 一样。我可以想出基于约定的视图查找逻辑。我只是在寻找 a)
Fredrik Normén 有一篇关于这个主题的博客文章:
http://weblogs.asp.net/fredriknormen/archive/2012/06/28/using-razor-together-with-asp-net-web-api.aspx 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());
上面的代码是从博客文章中复制的,不是我的作品
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)