Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api 从控制器外部访问属性_Api_Asp.net Core_.net Core_Formatting_Asp.net Core Webapi - Fatal编程技术网

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;
// ...
}
}
}