Информация о контроллере и / или действиях не легко доступна вне специфичных для MVC частей конвейера промежуточного программного обеспечения, не прибегая к сложному (и простому для взлома) коду, основанном на отражении.
Однако одинОбходной путь - использовать фильтр действий, чтобы добавить сведения об атрибуте в словарь HttpContext.Items
(который доступен во всем конвейере промежуточного программного обеспечения), и чтобы средство форматирования вывода получило его позже в конвейере промежуточного программного обеспечения.
Например,вы можете сделать ваш FileAttribute
производным от ActionFilterAttribute
и добавить его в HttpContext.Items
(используя уникальную ссылку на объект в качестве ключа) при выполнении:
public sealed class FileAttribute : ActionFilterAttribute
{
public FileAttribute(string filename)
{
Filename = filename;
}
public static object HttpContextItemKey { get; } = new object();
public string Filename { get; }
public override void OnActionExecuting(ActionExecutingContext context)
{
context.HttpContext.Items[HttpContextItemKey] = this;
}
}
Затем в выходном форматере выможет получить экземпляр атрибута и получить доступ к имени файла:
public sealed class FileOutputFormatter : OutputFormatter
{
public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
{
if (context.HttpContext.Items.TryGetValue(FileAttribute.HttpContextItemKey, out var item)
&& item is FileAttribute attribute)
{
var filename = attribute.Filename;
// ...
}
}
}