我想根据 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)