本文介绍了创建ASP.NET MVC的ETag过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想创建MVC一个ETag过滤器。
问题是,我无法控制Response.OutputStream,如果我能做到,我会简单地根据结果流计算ETag的。
我在WCF之前做这个事情,但无法找到任何简单的想法做,在MVC。
I would like to create an ETag filter in MVC.The problem is that I can't control the Response.OutputStream, if I was able to do that I would simply calculate the ETag according to the result stream.I did this thing before in WCF but couldn't find any simple idea to do that in MVC.
我希望能够写类似的东西。
I want to be able to write something like that
[ETag]
public ActionResult MyAction()
{
var myModel = Factory.CreateModel();
return View(myModel);
}
任何想法?
推荐答案
非常感谢这正是我一直在寻找。
只是做了一个小补丁的ETagFilter将处理304的情况下,该内容没有被更改
Thanks a lot it is exactly what I was looking for.Just made a small fix to the ETagFilter that will handle 304 in case that the content wasn't changed
public class ETagAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Response.Filter = new ETagFilter(filterContext.HttpContext.Response, filterContext.RequestContext.HttpContext.Request);
}
}
public class ETagFilter : MemoryStream
{
private HttpResponseBase _response = null;
private HttpRequestBase _request;
private Stream _filter = null;
public ETagFilter(HttpResponseBase response, HttpRequestBase request)
{
_response = response;
_request = request;
_filter = response.Filter;
}
private string GetToken(Stream stream)
{
byte[] checksum = new byte[0];
checksum = MD5.Create().ComputeHash(stream);
return Convert.ToBase64String(checksum, 0, checksum.Length);
}
public override void Write(byte[] buffer, int offset, int count)
{
byte[] data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
var token = GetToken(new MemoryStream(data));
string clientToken = _request.Headers["If-None-Match"];
if (token != clientToken)
{
_response.Headers["ETag"] = token;
_filter.Write(data, 0, count);
}
else
{
_response.SuppressContent = true;
_response.StatusCode = 304;
_response.StatusDescription = "Not Modified";
_response.Headers["Content-Length"] = "0";
}
}
}
这篇关于创建ASP.NET MVC的ETag过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!