Api 从控制器外部访问属性
是否可以从控制器外部访问控制器操作的自定义属性?我有一个自定义输出格式化程序,它应该返回一个具有特定名称的文件。我创建了一个接受字符串(文件名)的自定义属性,我想尝试从自定义输出格式化程序中访问该属性的值Api 从控制器外部访问属性,api,asp.net-core,.net-core,formatting,asp.net-core-webapi,Api,Asp.net Core,.net Core,Formatting,Asp.net Core Webapi,是否可以从控制器外部访问控制器操作的自定义属性?我有一个自定义输出格式化程序,它应该返回一个具有特定名称的文件。我创建了一个接受字符串(文件名)的自定义属性,我想尝试从自定义输出格式化程序中访问该属性的值 公共类文件属性:属性 { 公共ExcelTemplateAttribute(字符串文件名) { FileName=文件名; } 公共字符串文件名{get;} } 我的OutputFormatter如下所示: 公共类FileOutputFormatter:OutputFormatter { 公
公共类文件属性:属性
{
公共ExcelTemplateAttribute(字符串文件名)
{
FileName=文件名;
}
公共字符串文件名{get;}
}
我的OutputFormatter
如下所示:
公共类FileOutputFormatter:OutputFormatter
{
公共重写任务WriteResponseBodyAsync(OutputFormatterWriteContext)
{
//字符串文件名=???
}
}
我的API操作返回一个服务
[文件(“Template.txt”)]
public IActionResult Get([FromQuery]int-Id)
{
IEnumerable data=\u kenoReport.GetReportData(Id);
返回Ok(数据);
}
在中间件管道的MVC特定部分之外,如果不借助依赖于反射的复杂(且容易中断)代码,控制器和/或操作信息是不容易访问的
但是,一种解决方法是使用操作筛选器将属性详细信息添加到HttpContext.Items
字典(可在整个中间件管道中访问),并让输出格式化程序稍后在中间件管道中检索它
例如,您可以使您的文件属性
从ActionFilterAttribute
派生,并将其自身添加到HttpContext。执行时,项
(使用唯一的对象引用作为键):
公共密封类文件属性:ActionFilterAttribute
{
公共文件属性(字符串文件名)
{
Filename=文件名;
}
公共静态对象HttpContextItemKey{get;}=new object();
公共字符串文件名{get;}
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
context.HttpContext.Items[HttpContextItemKey]=这个;
}
}
然后,在输出格式化程序中,您可以检索属性实例并访问文件名:
公共密封类FileOutputFormatter:OutputFormatter
{
公共重写异步任务WriteResponseBodyAsync(OutputFormatterWriteContext)
{
if(context.HttpContext.Items.TryGetValue(FileAttribute.HttpContextItemKey,out var item)
&&项目为FileAttribute(属性)
{
var filename=attribute.filename;
// ...
}
}
}