首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何安全地拦截自定义Owin中间件中的响应流

如何安全地拦截自定义Owin中间件中的响应流
EN

Stack Overflow用户
提问于 2014-10-06 18:13:18
回答 1查看 13.6K关注 0票数 23

我正在尝试编写一个简单的OWIN中间件,以便拦截响应流。我要做的是用自定义的基于stream的类替换原始流,这样我就能够截获对响应流的写入。

然而,我面临着一些问题,因为我不能知道响应何时已由链中的内部中间件组件完全写入。永远不会调用流的Dispose重写。所以我不知道什么时候执行我的处理,这应该发生在响应流的末尾。

下面是一个示例代码:

代码语言:javascript
复制
public sealed class CustomMiddleware: OwinMiddleware
{
    public CustomMiddleware(OwinMiddleware next)
        : base(next)
    {
    }

    public override async Task Invoke(IOwinContext context)
    {
        var request = context.Request;
        var response = context.Response;

        // capture response stream

        var vr = new MemoryStream();
        var responseStream = new ResponseStream(vr, response.Body);

        response.OnSendingHeaders(state =>
        {
            var resp = (state as IOwinContext).Response;
            var contentLength = resp.Headers.ContentLength;

            // contentLength == null for Chunked responses

        }, context);

        // invoke the next middleware in the pipeline

        await Next.Invoke(context);
    }
}

public sealed class ResponseStream : Stream
{
    private readonly Stream stream_; // MemoryStream
    private readonly Stream output_; // Owin response
    private long writtenBytes_ = 0L;

    public ResponseStream(Stream stream, Stream output)
    {
        stream_ = stream;
        output_ = output;
    }

    ... // System.IO.Stream implementation

    public override void Write(byte[] buffer, int offset, int count)
    {
        // capture writes to the response stream in our local stream
        stream_.Write(buffer, offset, count);

        // write to the real output stream
        output_.Write(buffer, offset, count);

        // update the number of bytes written

        writtenBytes_ += count;

        // how do we know the response is complete ?
        // we could check that the number of bytes written
        // is equal to the content length, but content length
        // is not available for Chunked responses.
    }

    protected override void Dispose(bool disposing)
    {
        // we could perform our processing
        // when the stream is disposed of.
        // however, this method is never called by
        // the OWIN/Katana infrastructure.
    }
}

正如我在上面代码的注释中提到的,为了检测响应是否完整,我可以想到两种策略。

a)我可以记录写入响应流的字节数,并将其与预期响应长度相关联。然而,在使用分块传输编码的响应的情况下,长度是未知的。

b)当在响应流上调用Dispose时,我可以确定响应流是完整的。但是,OWIN/Katana基础设施从不在替换的流上调用Dispose。

我一直在调查Opaque Streaming,以了解操纵底层HTTP协议是否可行,但我似乎没有发现Katana是否支持不透明流。

有没有办法实现我想要的东西?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26214113

复制
相关文章

相似问题

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