asp.net-web-api – 在ASP.NET Core Web API中实现HTTP缓存(ETag)
|
我正在使用ASP.NET Core(ASP.NET 5)Web API应用程序,并且必须在实体标签的帮助下实现HTTP缓存.早些时候我使用了CacheCow,但现在似乎不支持ASP.NET Core.我也没有找到任何其他相关的库或框架支持的详细信息. 我可以编写相同的自定义代码,但之前我想看看是否有任何可用的.请分享一些可用的东西,什么是更好的实现方式. 非常感谢. 解决方法我也有同样的要求,但是 Bennie Wentzel’s anwser还没有完成,因为它仍然返回响应的正文.根据 spec 不应该.经过一段时间的尝试使其与中间件一起工作,我发现MVC action filters实际上更适合这个功能. 在这个例子中,我借用了Bennie的ETag生成代码: public class ETagFilter : Attribute,IActionFilter
{
private readonly int[] _statusCodes;
public ETagFilter(params int[] statusCodes)
{
_statusCodes = statusCodes;
if (statusCodes.Length == 0) _statusCodes = new[] {200};
}
public void OnActionExecuting(ActionExecutingContext context)
{
}
public void OnActionExecuted(ActionExecutedContext context)
{
if (context.HttpContext.Request.Method == "GET")
{
if (_statusCodes.Contains(context.HttpContext.Response.StatusCode))
{
//I just serialize the result to JSON,could implement IEquality<> for better performance.
var content = context.Result.ToJson();
var etag = ETagGenerator.GetETag(context.HttpContext.Request.Path.ToString(),Encoding.UTF8.GetBytes(content));
if (context.HttpContext.Request.Headers.Keys.Contains("If-None-Match") && context.HttpContext.Request.Headers["If-None-Match"].ToString() == etag)
{
context.Result = new StatusCodeResult(304);
}
context.HttpContext.Response.Headers.Add("ETag",new[] { etag });
}
}
}
}
然后将其用作您想要的动作或控制器作为属性: [HttpGet]
[Route("/api/data/")]
[ETagFilter(200)]
public async Task<IActionResult> GetDataFromApi()
{
...
}
这两种方法之间的重要区别在于,您的中间件可以在MVC middlware之前和之后运行,并且只能使用HttpContext.一旦MVC开始将响应发送回客户端,为时已晚,无法进行任何更改. 另一方面,动作过滤器是MVC中间件的一部分.他们可以访问MVC上下文,在这种情况下,实现此功能更为简单. More on Filters及其在MVC中的管道. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在asp.net App_Code目录中使用Nemerle
- asp.net – 在不使用HttpRequest的情况下获取主机名
- 体系结构设计良好的ASP.NET WebForms站点示例
- asp.net-mvc-3 – insert命令需要插入数据绑定设置Kendo Gr
- asp.net-mvc – 如何设置html.EditorFor helper的大小?
- asp.net – 如何构建专门的JQuery Timer
- ASP.NET 5/ASP.NET Core中的关注点和n层架构的分离1
- asp.net-mvc – 使用嵌套显示模板时如何防止Razor向输入添加
- ASP.NET 5中的子域路由
- asp.net-mvc – ASP.NET MVC中的代码
