ASP.NET MVC 4 / Web API - 为接受插入 Razor 渲染器:text/html

2024-04-06

我正在使用 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(使用前将#替换为@)

ASP.NET MVC 4 / Web API - 为接受插入 Razor 渲染器:text/html 的相关文章

随机推荐

  • Java中静态字段的确切含义是什么?

    我想在同一类对象的各个实例之间共享一个对象 从概念上讲 当我的程序运行时 A 类的所有对象都访问 B 类的同一个对象 我见过那个static是系统范围的 并且不鼓励使用它 这是否意味着如果我有另一个程序在实例化 A 类对象的同一个 JVM
  • TCP 服务器的 GCP 计算引擎防火墙规则

    我创建了一个具有静态外部 IP 地址的 GCP 计算引擎实例 机器类型 n1 standard 2 2 个 vCPU 7 5 GB 内存 操作系统是Linux Debian 我的目的是在机器上创建一个普通的 Node js TCP 服务器
  • 如何在 Jenkinsfile 中设置 github pull request 构建?

    所以 我已经使用 Jenkins 有一段时间了 我已经使用 Github Pull Request Builder 插件设置了许多项目 以便在有人打开拉取请求时运行测试 然后在拉取请求实际合并到 master 时触发一些其他作业 构建 推送
  • Atomikos 事务日志 com.atomikos.icatch.enable_logging=false

    我想了解如果我设置分布式事务功能是否适用于我的应用程序com atomikos icatch enable logging false 我是否正确理解事务恢复与发生崩溃的情况相关 并且我们希望完全重新启动同一事务 恢复是否在同一个分布式事务
  • 直接执行自定义SQL时django-mssql中查询超时过期

    我正在查询一个视图 该视图将返回大量数据 并且需要 1 分钟以上才能完成 我正在使用 django db connection cursor 执行查询 因为这不是我的默认数据库 30 秒后 我收到异常 查询超时已过期 我认为 30 秒是 d
  • ARC 中的系统对象委托是否需要设置为 nil?

    应用程序有时会因错误而崩溃objc object release 苹果开发者技术支持提到了这一点 请记住 您应该始终执行类似 tableView delegate 的操作 零 在你的 dealloc 方法中 即使你使用的是 ARC 出于兼容
  • 使用 Http/2 从 javascript 进行 api 调用

    我知道大多数浏览器支持 http 2 来加载页面 但这是否意味着我在使用 XmlHttpRequest 进行 api 调用时可以利用它 更具体地说 我的问题是 如果我使用 XmlHttpRequest 进行 2 次调用来获取数据 是否可以确
  • Flutter 中 GridView.count 与 GridView.builder 的区别

    有什么区别gridview builder and gridview count在颤振中 和其他任何人一样 builder GridView builder https api flutter dev flutter widgets Gri
  • React Select:传入自定义渲染使用的额外数据

    我正在使用反应选择 目前我正在从elasticsearch中获取数据并将其设置为 var new titles body hits hits forEach function obj looping through elasticsearc
  • Silverlight 4.0 的最佳 Jpeg 编码器

    我想将 Writablebitmap 转换为 Jpeg 流 看起来没有平台支持 而且我在网上看到了一堆开源编码器库 我想听听您的意见 就性能和性能而言 推荐哪个可靠性 我取得了很好的经验FJCore http code google com
  • 汇集估算数据集的 glmers

    问题 我有一个数据集 其中缺少一些预测变量值 我想要池glmer已应用于这些插补集的模型一起 我正在使用mice包来创建插补 我也使用过amelia and mi也没有成功 我想主要提取固定效应 使用pool mouse 包中的函数返回错误
  • 如何在本机反应中显示隐藏的导航栏

    我在本机反应中使用 NavigatorIOS 时遇到麻烦
  • 如何使用带有响应式 UI 的 Xamarin Android 将数据绑定到自定义 ListView

    我正在使用带有响应式 UI 的 Xamarin Android 而不是使用 Xamarin Forms 我有一个自定义 ListView 我已将其布局定义为 xaml 我不知道如何将此控件绑定到 ViewModel 中的 observabl
  • 哪些平台不在 type_info op== 中使用字符串比较?

    这是一个典型的实现type info operator if PLATFORM SUPPORTS UNIQUE TYPEINFO bool operator const type info rhs const return mangled
  • 在应用程序购买中验证

    我正在构建一个 iPhone 应用程序 该应用程序应该通过应用程序内购买处理订阅 当我在应用程序中从 Apple 收到收据时 我想将收据保存在我自己的服务器上 并且在我的服务器上我还想通过 Apple 服务器验证收据 与我的服务器建立连接非
  • 将整数变量传递给任务而不丢失整数类型

    我有一个我不拥有的任务 实际上是一个角色 但在这里使用任务是为了使示例更容易 它对变量进行一些操作 它假设变量是整数 我需要以某种方式向它传递一个变量并将其作为 int 传递 但我没有任何运气 这是我不拥有的任务的超级简化版本 frob y
  • 信息堆大小

    我可以从以下网站获得哪些信息performance memoryChrome 中的对象 这些数字意味着什么 它们是kb还是字符 我可以从这些数字中了解到什么 示例值performance memory MemoryInfo jsHeapSi
  • 为什么这个正则表达式在 Java 中不能按预期工作?

    简单的正则表达式问题 答案很可能是 Java 特定的 This is a comment in a file matches 这会返回 false 据我所知 意味着它总是意味着什么 没有什么特殊意义 所以我就翻译一下 作为 字符串开头的 哪
  • 如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)?

    你好 我一直在寻找一种方法play and recordLinux 最好是 Ubuntu 系统上的音频 我目前正在开发一个前端语音识别工具包 https www launchpad net cmusphinx train这将自动执行调整语音
  • ASP.NET MVC 4 / Web API - 为接受插入 Razor 渲染器:text/html

    我正在使用 ASP NET MVC 4 Web API 创建 RESTful Web 服务 对于 API 访问 我返回 JSON 但一旦一切正常工作 内容协商应该默认适用于 XML 和 JSON 由于我正在致力于实现真正的 RESTful