是否可以根据 Accept 标头的媒体类型在 .NET MVC 中选择具有 AttributeRouting 的操作?

2024-04-30

我想根据 Accept 标头中请求的媒体类型选择控制器的操作。

例如,我有一个称为主题的资源。其指定路线为:

GET /subjects/{subjectId:int}

一般情况下,浏览器会请求text/html,这很好。默认的媒体格式化程序可以很好地处理这个问题。

现在,当使用指定的接受标头访问同一路由时,我想要执行自定义逻辑application/pdf作为接受的媒体类型。

我可以创建一个自定义媒体格式化程序,但是,据我了解,这意味着将 Accept 标头请求的任何路由设置为application/pdf也将通过此媒体格式化程序运行。这是无法接受的。

在Java中,有一个注解叫做@Produces https://docs.oracle.com/cd/E19798-01/821-1841/gipxf/index.html:

@Produces 注释用于指定 MIME 媒体类型或 资源可以生成并发回客户端的表示。如果 @Produces应用于类级别,资源中的所有方法 默认情况下可以生成指定的 MIME 类型。如果应用在 方法级别,该注释会覆盖任何@Produces注释 应用在班级层面。

这将使我能够执行以下操作:

namespace MyNamespace
{
    [RoutePrefix("subjects")]
    public class SubjectsController : Controller
    {
        [Route("{subjectId:int}")]
        [HttpGet]
        public ActionResult GetSubject(int subjectId)
        {
        }

        [Route("{subjectId:int}")]
        [HttpGet]
        [Produces("application/pdf")]
        public ActionResult GetSubjectAsPdf(int subjectId)
        {
            //Run my custom logic here to generate a PDF.
        }
    }
}

当然,我在 .NET 中找不到 Produces 属性,所以这不起作用。我也没有找到类似的属性。

我当然可以手动检查操作主体内的标头,并将其重定向到另一个操作,但这充其量看起来很黑客。

.NET 4.5 中是否有一种机制可以用来实现我忽略或遗漏的功能?

(我正在使用 NuGet 存储库中的 MVC 5.2.2)


在互联网上搜索了一段时间后,我想到了最好的方法是创建一个ActionMethodSelectorAttribute.

下面是一个非常幼稚的、第一次通过的实现ProducesAttribute我写的最终目的是模仿 Java 的 Produces 注释:

namespace YourNamespace
{
    using System;
    using System.Collections.Generic;
    using System.Net;
    using System.Net.Mime;
    using System.Web.Mvc;

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class ProducesAttribute : ActionMethodSelectorAttribute
    {
        private readonly ISet<ContentType> acceptableMimeTypes;

        public ProducesAttribute(params string[] acceptableMimeTypes)
        {
            this.acceptableMimeTypes = new HashSet<ContentType>();

            foreach (string acceptableMimeType in acceptableMimeTypes)
                this.acceptableMimeTypes.Add(new ContentType(acceptableMimeType));
        }

        public override bool IsValidForRequest(ControllerContext controllerContext, System.Reflection.MethodInfo methodInfo)
        {
            string acceptHeader = controllerContext.RequestContext.HttpContext.Request.Headers[HttpRequestHeader.Accept.ToString()];
            string[] headerMimeTypes = acceptHeader.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries);

            foreach (var headerMimeType in headerMimeTypes)
            {
                if (this.acceptableMimeTypes.Contains(new ContentType(headerMimeType)))
                    return true;
            }

            return false;
        }
    }
}

它旨在与属性路由一起使用,并且可以按如下方式应用:

public sealed class MyController : Controller
{
    [Route("subjects/{subjectId:int}")] //My route
    [Produces("application/pdf")]
    public ActionResult GetSubjectAsPdf(int subjectId)
    {
        //Here you would return the PDF representation.
    }

    [Route("subjects/{subjectId:int}")]
    public ActionResult GetSubject(int subjectId)
    {
        //Would handle all other routes.
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以根据 Accept 标头的媒体类型在 .NET MVC 中选择具有 AttributeRouting 的操作? 的相关文章

  • WPF Treeview,如何更改缩进

    我的树视图基本上有 文件夹 节点 以及不包含其他项目的项目下面的一层 因此 不需要用于展开 折叠图标的空间 在第 2 层 我可以放弃这个图标空间从而减少缩进吗 项目 在示例 机场 中 应向左移动一些像素 重要提示 基本上是寻找代码解决方案
  • SQL Server中主键和唯一索引的区别[重复]

    这个问题在这里已经有答案了 我的公司目前正在重写我们最近获得的一个应用程序 我们选择使用 ASP net mvc4 来构建这个系统 并使用实体框架作为我们的 ORM 我们收购的公司的前任所有者非常坚定地要求我们使用他们的旧数据库 并且不对其
  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • URL 中的点 (.) 字符错误

    当我点击编辑具有此 url 的用户时遇到问题ASP NET MVC 3项目 http domain com 8089 User EditUser username surname IDUser e11a621p df11 4687 9903
  • App_Web_XXX.dll 中发生 System.NullReference 异常 - 部分视图中出现错误

    当登陆我的 MVC 页面之一时 我收到此错误 dll 名称中包含随机字符串 类型的第一次机会异常系统 NullReferenceException发生在 App Web cjmhrrqn dll 中 附加信息 未将对象引用设置为对象的实例
  • ASP.NET MVC 视图引擎解析顺序

    我创建了一个简单的 ASP NET MVC 1 0 版应用程序 我有一个 ProductController 它有一个操作索引 在视图中 我在Product子文件夹下创建了相应的Index aspx 然后我引用了 Spark dll 并在同
  • ASP.NET MVC:FileStreamResult 返回太多字节?

    我正在调用 MVC 控制器方法 返回类型是FileStreamResult 在此方法中 我以字节数组的形式创建图像 我正在创建一个 MemoryStream 在构造函数中传递字节数组 然后 我在构造函数中返回一个新的 FileStreamR
  • .Net MVC 4 项目失败,并出现事件日志错误“模块 DLL C:\WINDOWS\system32\inetsrv\aspnetcore.dll 无法加载。数据是错误。”

    这不是 DotNetCore 项目 它是 MVC 4 项目 并且应用程序池已正确配置为使用 dotnet CLR v4 但在更新到新版本的 Windows 10 后 无论是内部版本还是新的周年更新 启动应用程序失败 事件日志显示以下错误 模
  • ASP.NET MVC 的示例 MS 应用程序?

    我正在开始我的第一个 MVC 项目 并希望有一个良好的开端 我了解如何创建快速但肮脏的 MVC 应用程序的基础知识 但是 我想获得使用开发 ASP NET MVC 应用程序最佳实践的资源 文档或示例快速入门应用程序 任何帮助表示赞赏 书呆子
  • MVC4 - ContextDependentView - 是什么意思?

    我刚刚开始使用 MVC4 我看到的第一个操作方法有一些新内容 我查了一下互联网 找不到任何关于此的信息 public ActionResult LogOn return ContextDependentView 有谁知道 ContextDe
  • 保护 ASP.NET MVC 应用程序中的 ajax 调用的安全

    我有一个基于 ASP NET MVC 的应用程序 它允许根据用户进行不同级别的访问 当前的工作方式是 当用户访问页面时 会根据数据库进行检查以确定用户拥有的权限 然后根据用户拥有的访问级别选择视图 有些用户比其他用户看到更多数据并拥有更多可
  • 当我的模型为空时,如何避免视图内的 foreach 循环中出现 NullReferenceException?

    当我通过控制器传入 null 值时 我的视图中收到以下代码的 NullReferenceException 未由用户代码处理 错误 在某些情况下 我想传入 null 值 但我不希望发生这种情况时引发错误 我应该将我的代码更改为什么 最初我的
  • 标准 Html.DisplayTextFor() 没有 HTML 编码吗?

    我们目前正在处理 ASP NET MVC 项目之一的一些 XSS 问题 我发现两个问题 第一个问题与我们的请求验证模式有关 攻击者现在可以利用此安全漏洞在我们的数据库中删除一些不良内容 第二个问题是我们如何显示此内容 我们使用 Html D
  • 将 JSON 反序列化为自定义列表

    我有这个 json var x 99 abc 2dp GroupNum 0 Total 4 1 7 x date 60 x 1dp GroupNum 1 存在以下规则 让i参考内部列表索引 x i 0 必填项 始终为整数 x i 1 必填项
  • ASP.NET MVC 防伪造令牌不安全

    在没有 ssl 的情况下向服务器发出请求时 我实际上可以看到 MVC3 框架以纯文本形式生成的验证令牌密钥 该密钥存储在名为 RequestVerificationToken Lw 的 cookie 中 在混合安全环境中 实际上可以在向非
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 如何在单击按钮时重新绑定 igGrid igniteUI 控件中的数据?

    我在 ASP NET MVC3 应用程序中使用 Infragistics Ignite UI 控件 我有一个已绑定到 客户 数据的网格 工作正常 现在我有按钮了 单击后我会进行 ajax 调用 在控制器中 我编写了仅选择 客户 数据的一部分
  • 我需要改变什么才能正确实施 SOLID 设计?

    我正在尝试学习 SOLID 设计 但我认为我犯了一个错误 我认为IItem界面不遵循里氏替换原则在我的内Player但是 我不知道如何解决这个问题 如果我从 IItem 添加新的界面绘图 我将必须更改 Player 的方法以添加一个案例来处
  • jsFiddle 中的 jQuery 不显眼的自定义适配器和方法

    我无法使 jsFiddle 工作 但它可以在浏览器中工作 http jsfiddle net vtortola jYq2X http jsfiddle net vtortola jYq2X 我正在尝试添加新的自定义规则来比较两个字段 自定义
  • 您如何填充/验证您的 ViewModel?

    我很好奇人们构建 ViewModel 的各种方式以及他们为什么选择该方法 我在这里可以想到几种方法 1 注入存储库 控制器加载模型并映射到 ViewModel 这里 ViewModel 构造函数可以采用各种集合来进行内部设置 在选择列表中

随机推荐

  • 对 Windows 窗体上的字段执行数据验证的最简单方法

    我有一个 Windows 窗体项目 我想在用户按下底部的计算按钮之前强制用户在某些字段中输入值 这些字段包括三对单选按钮 five 文本框和一个组合框 因此基本上所有这些字段都需要包含一个值才能执行计算 此外 文本框应包含numbers 任
  • 定义 WebActivator.PreApplicationStartMethod 类的初始化顺序

    我有几个 WebActivator PreApplicationStartMethod 装饰类 一个用于 Ninject 另一个用于 AwesomeMVC 第三个用于后台任务调度程序 问题是调度程序类需要利用 IoC 容器解决的依赖关系 我
  • 作用域对象的 Xtext 示例

    我正在寻找一个示例 在 XText 中 说明如何在用户定义的对象成员上实现代码完成 据我所知 我需要使用 IScope 但所有这些如何连接在一起还不清楚 鉴于trait是用户定义的类型 我如何构建语法来编码完成 验证其中包含的方法Strin
  • WordPress URL 中的正斜杠

    我正在将我的网站从 Drupal 迁移到 Wordpress 在 Drupal 中 我可以轻松地给 URL 指定一个别名 这个别名可以是任何东西 即 www example com abc xyz hello html 但在 WordPre
  • 来自两个表的数据而不重复第一个表的数据?

    我的 MySQL 数据库中有两个表 用户表和用户元表 我正在寻找一种方法 通过一个查询从两个表中获取所有信息 但不重复用户表中的信息 这也是与用户 ID 号相关的所有信息 例如 user id 1 有没有办法查询数据库并收集两个表中的所有信
  • 如何从 URL 获取视图中的当前路由 ID (ASP.NET MVC)

    在从 URL 例如 Controller Action 1 返回的视图中 假设默认路由为controller action id 如何从视图中访问 ID 我不想在处理请求时将其添加到操作级别的 ViewData 字典中 我认为这就是您正在寻
  • Crystal Reports 间歇性错误“无法提交请求以进行后台处理。”

    我们在带有 NET Framework 3 5 SP1 的 Windows Server 2008 上运行 Crystal Reports 我见过许多导致一般错误 无法提交请求进行后台处理 的原因 然而 在其他论坛上 由于特定报告的特定格式
  • 两种模板类型和两个模板参数列表有什么区别?

    这两个声明有什么区别 template
  • 如何在自定义服务器控件asp中使用.resx和.resource文件?

    我正在编写自己的服务器端控件 并且使用存储在 resx文件 在控制台应用程序中 此代码运行良好 ResXResourceReader rsxr new ResXResourceReader Resource1 resx foreach Di
  • 将 XML 反序列化为类

    我有正在反序列化的 XML 这是我的 XML
  • 自定义地图标注视图点击即可隐藏

    我已经制作了自定义地图标注 我的标注包含UIButtons and UITextView 当我点击时UIButton 按起来很好 但是当我点击UITextView它将光标移动到点击位置 然后取消选择图钉并消失标注 我已经实施了hitTest
  • Postgres触发器函数更新另一个表中的聚合结果

    我有两张桌子 表 x 和表 y 表 x 每天都会更新 我希望在表 x 中插入新数据后立即更新表 y 表 y 包含表 x 中每天所有更新的聚合值 Date为Date类型 其余两列为real类型 Table x 可以每天更新 table y 应
  • 当url中有空格时htaccess重定向

    我想从仍然出现在谷歌搜索中的旧网址重定向到新网址 旧的网址是这样的 http www marionettecolla org file 20 mostra milano mostra marionette milano htm 我想将其重定
  • 每天在 R 数据帧上应用 cut()

    我在 R 中有一个数据表 我在其中应用了cut and table 我能够根据条件得到频率表 但我得到了总体频率 我想明智地做到这一点 我有一个名为timestamp其中有时间戳 我还有一个section具有价值的列A or B 如何根据每
  • C# 文本文件 - 如何写入 EOF 字符

    这一定是一个简单的问题 但我没有找到任何东西 我有一个文本文件 我需要在末尾放置一个 EOF 字符 以便第三方供应商可以正确读取文件 写入文件结尾字符所需的转义字符是什么 我不确定是否需要提供更多信息 但如果需要 请告诉我 Thanks 如
  • iOS PhoneGap 调试工作流程

    如何在 Xcode 中调试 javascript 我可以做的一件事是在 OS X Chrome 浏览器中打开页面 但这自然不适用于涉及本机代码的应用程序流 我是否缺少一个聪明的 Xcode 技巧 随着 iOS 6 的发布 Apple 与 M
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览
  • 用于 Cast 对话框的 Android MediaMetaData 图像

    注意到演员对话框中有一些奇怪的东西 使用 MediaInfo Builder 为调用 RemoteMediaClient load mediainfo 准备 MediaInfo 如果这次 MediaMetaData addImage 使用与
  • gcc 预编译头使用 -c 选项时出现奇怪的行为

    短篇故事 我无法使用 gcc c 选项使预编译头正常工作 很长的故事 各位 我在 Linux 上使用 gcc 4 4 1 在一个非常大的项目中尝试预编译头之前 我决定在简单的程序上测试它们 他们 有点工作 但我对结果不满意 我确信我的设置有
  • 是否可以根据 Accept 标头的媒体类型在 .NET MVC 中选择具有 AttributeRouting 的操作?

    我想根据 Accept 标头中请求的媒体类型选择控制器的操作 例如 我有一个称为主题的资源 其指定路线为 GET subjects subjectId int 一般情况下 浏览器会请求text html 这很好 默认的媒体格式化程序可以很好