gpt4 book ai didi

asp.net-mvc - 在 ASP.NET MVC 中创建 ETag 过滤器

转载 作者:行者123 更新时间:2023-12-03 09:55:32 26 4
gpt4 key购买 nike

我想在 MVC 中创建一个 ETag 过滤器。
问题是我无法控制 Response.OutputStream,如果我能够做到,我将根据结果流简单地计算 ETag。
我之前在 WCF 中做过这件事,但在 MVC 中找不到任何简单的想法。

我希望能够写出这样的东西

[ETag]
public ActionResult MyAction()
{
var myModel = Factory.CreateModel();
return View(myModel);
}

任何的想法?

最佳答案

这是我能想到的最好的方法,我真的不明白你不能控制 Response.OutputStream 是什么意思。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Web.Mvc;

public class ETagAttribute : ActionFilterAttribute
{
private string GetToken(Stream stream) {
MD5 md5 = MD5.Create();
byte [] checksum = md5.ComputeHash(stream);
return Convert.ToBase64String(checksum, 0, checksum.Length);
}

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.AppendHeader("ETag", GetToken(filterContext.HttpContext.Response.OutputStream));
base.OnResultExecuted(filterContext);
}
}

这应该有效,但不是。

显然微软覆盖了 System.Web.HttpResponseStream.Read(Byte[] buffer, Int32 offset, Int32 count) 以便它返回“不支持指定的方法。”,不知道他们为什么会这样做,因为它继承了系统。 IO.Stream 基类...

混合了以下资源, Response.OutputStream 是只写流,所以我们必须使用 Response.Filter 类来读取输出流,有点古怪,您必须在过滤器上使用过滤器,但是它有效 =)

http://bytes.com/topic/c-sharp/answers/494721-md5-encryption-question-communication-java
http://www.codeproject.com/KB/files/Calculating_MD5_Checksum.aspx
http://blog.gregbrant.com/post/Adding-Custom-HTTP-Headers-to-an-ASPNET-MVC-Response.aspx
http://www.infoq.com/articles/etags
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

更新

经过多次战斗,我终于能够让它发挥作用:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Web;
using System.Web.Mvc;

public class ETagAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
try {
filterContext.HttpContext.Response.Filter = new ETagFilter(filterContext.HttpContext.Response);
} catch (System.Exception) {
// Do Nothing
};
}
}

public class ETagFilter : MemoryStream {
private HttpResponseBase o = null;
private Stream filter = null;

public ETagFilter (HttpResponseBase response) {
o = response;
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);
filter.Write(data, 0, count);
o.AddHeader("ETag", GetToken(new MemoryStream(data)));
}
}

更多资源:

http://authors.aspalliance.com/aspxtreme/sys/Web/HttpResponseClassFilter.aspx
http://forums.asp.net/t/1380989.aspx/1

关于asp.net-mvc - 在 ASP.NET MVC 中创建 ETag 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6642815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com