gpt4 book ai didi

c# - IIS 7 托管模块无法获取内容长度或发送的字节数

转载 作者:太空狗 更新时间:2023-10-29 20:22:41 32 4
gpt4 key购买 nike

我有一个用于 IIS 6 的 ISAPI 过滤器,它使用响应的字节发送字段进行一些自定义处理。我想为 IIS 7 更新它,但我遇到了问题。 IIS 7 事件似乎都无法访问内容长度、发送的字节数或任何可以让我计算内容长度或发送的字节数的数据。 (我知道发送的内容长度 header 和字节数不一样,但都可以用于此目的。)

据我所知,内容长度 header 是在托管模块执行完毕后由 HTTP.SYS 添加的。现在我有一个在 EndRequest 上运行的事件处理程序。如果我能得到输出流,我就可以自己计算出我需要什么,但托管管道似乎也无法访问它。

是否有某种方法可以获取托管管道中发送的内容长度或字节数?如果做不到这一点,是否有某种方法可以计算从托管管道中可用的对象发送的内容长度或字节数?

最佳答案

要获取发送的字节数,您可以使用 <a href="http://msdn.microsoft.com/en-us/library/system.web.httpresponse.filter.aspx" rel="noreferrer noopener nofollow">HttpResponse.Filter</a>属性(property)。正如 MSDN 文档所说,此属性获取或设置一个包装过滤器对象,用于在传输之前修改 HTTP 实体主体。

您可以创建一个新的 <a href="http://msdn.microsoft.com/en-us/library/system.io.stream.aspx" rel="noreferrer noopener nofollow">System.IO.Stream</a>包装现有的 HttpResponse.Filter流并计算传入 Write 的字节数在传递它们之前的方法。例如:

public class ContentLengthModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += OnBeginRequest;
context.EndRequest += OnEndRequest;
}

void OnBeginRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
application.Response.Filter = new ContentLengthFilter(application.Response.Filter);
}

void OnEndRequest(object sender, EventArgs e)
{
var application = (HttpApplication) sender;
var contentLengthFilter = (ContentLengthFilter) application.Response.Filter;
var contentLength = contentLengthFilter.BytesWritten;
}

public void Dispose()
{
}
}

public class ContentLengthFilter : Stream
{
private readonly Stream _responseFilter;

public int BytesWritten { get; set; }

public ContentLengthFilter(Stream responseFilter)
{
_responseFilter = responseFilter;
}

public override void Flush()
{
_responseFilter.Flush();
}

public override long Seek(long offset, SeekOrigin origin)
{
return _responseFilter.Seek(offset, origin);
}

public override void SetLength(long value)
{
_responseFilter.SetLength(value);
}

public override int Read(byte[] buffer, int offset, int count)
{
return _responseFilter.Read(buffer, offset, count);
}

public override void Write(byte[] buffer, int offset, int count)
{
BytesWritten += count;
_responseFilter.Write(buffer, offset, count);
}

public override bool CanRead
{
get { return _responseFilter.CanRead; }
}

public override bool CanSeek
{
get { return _responseFilter.CanSeek; }
}

public override bool CanWrite
{
get { return _responseFilter.CanWrite; }
}

public override long Length
{
get { return _responseFilter.Length; }
}

public override long Position
{
get { return _responseFilter.Position; }
set { _responseFilter.Position = value; }
}
}

关于c# - IIS 7 托管模块无法获取内容长度或发送的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/483979/

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