首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Azure函数中是否存在(或即将有)一个ResponseCache等效?

在Azure函数中是否存在(或即将有)一个ResponseCache等效?
EN

Stack Overflow用户
提问于 2021-01-05 23:50:35
回答 1查看 408关注 0票数 0

在Azure函数中是否存在与ASP.NET核心ResponseCache属性等价的内容。我希望我的函数添加一个缓存控制头。

与ASP.NET核心类似:

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.responsecacheattribute?view=aspnetcore-5.0

或者有一个与Azure函数V3兼容的解决方案?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-07 05:39:10

如果您想在Azure函数中实现响应缓存,我们可以使用arrtibute FunctionInvocationFilterAttribute来实现它。

例如

实现ResponseCacheAttribute

代码语言:javascript
复制
 class FunctionResponseCacheAttribute : FunctionInvocationFilterAttribute
    {
        private readonly int _duration;
        private readonly ResponseCacheLocation _cacheLocation;
        public FunctionResponseCacheAttribute(
            int duration,
            ResponseCacheLocation cacheLocation)
        {
            _duration = duration;
            _cacheLocation = cacheLocation;
        }
        public override async Task OnExecutedAsync(
            FunctionExecutedContext executedContext,
            CancellationToken cancellationToken)
        {
            if (!(executedContext.Arguments.First().Value is HttpRequest request))
                throw new ApplicationException(
                    "HttpRequest is null. ModelBinding is not supported, " +
                    "please use HttpRequest as input parameter and deserialize " +
                    "using helper functions.");
            var headers = request.HttpContext.Response.GetTypedHeaders();
            var cacheLocation = executedContext.FunctionResult?.Exception == null
                ? _cacheLocation
                : ResponseCacheLocation.None;
            switch (cacheLocation)
            {
                case ResponseCacheLocation.Any:
                    headers.CacheControl = new CacheControlHeaderValue()
                    {
                        MaxAge = TimeSpan.FromSeconds(_duration),
                        NoStore = false,
                        Public = true
                    };
                    break;
                case ResponseCacheLocation.Client:
                    headers.CacheControl = new CacheControlHeaderValue()
                    {
                        MaxAge = TimeSpan.FromSeconds(_duration),
                        NoStore = false,
                        Public = true
                    };
                    break;
                case ResponseCacheLocation.None:
                    headers.CacheControl = new CacheControlHeaderValue()
                    {
                        MaxAge = TimeSpan.Zero,
                        NoStore = true
                    };
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
            await base.OnExecutedAsync(executedContext, cancellationToken);
        }
    }

  1. Usage

代码语言:javascript
复制
[FunctionName("Function1")]
        [FunctionResponseCache(60 * 60, ResponseCacheLocation.Any)]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
        }

根据情况更新,我认为您可以在函数中添加以下代码来实现它

代码语言:javascript
复制
 [FunctionName("Function1")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

...
            var resHeaders = req.HttpContext.Response.GetTypedHeaders();
            resHeaders.CacheControl = new CacheControlHeaderValue()
            {
                MaxAge = TimeSpan.FromSeconds(3600),
                NoStore = false,
                Public = true
            };
 ...
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65588216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档