的maxRequestLength - 幕后细节需要! [英] maxRequestLength - behind the scene details needed!

查看:88
本文介绍了的maxRequestLength - 幕后细节需要!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么是文件上传过程中真的发生在IIS当前执行的请求,当上载长度超过了配置的maxRequestLength。
力图找到谈论一个像样的文章,但有没有!!

What really happens to the currently executing request in IIS during a file upload, when the upload length exceed configured maxRequestLength. Tried hard to find a decent article that talks about that, but there are none!!

感谢

推荐答案

这是到底发生了什么:

在类的Htt prequest 和方法 GetEntireRawContent 这个条件被选中,将抛出一个异常:

In class HttpRequest and in method GetEntireRawContent this condition is checked and will throw an exception:

if (length > maxRequestLengthBytes)
{
    throw new HttpException(System.Web.SR.GetString("Max_request_length_exceeded"), null, 0xbbc);
}

下面是整个方法,如果你觉得有用的:

Here is the whole of the method if you find useful:

    private HttpRawUploadedContent GetEntireRawContent()
    {
        if (this._wr == null)
        {
            return null;
        }
        if (this._rawContent == null)
        {
            HttpRuntimeSection httpRuntime = RuntimeConfig.GetConfig(this._context).HttpRuntime;
            int maxRequestLengthBytes = httpRuntime.MaxRequestLengthBytes;
            if (this.ContentLength > maxRequestLengthBytes)
            {
                if (!(this._wr is IIS7WorkerRequest))
                {
                    this.Response.CloseConnectionAfterError();
                }
                throw new HttpException(System.Web.SR.GetString("Max_request_length_exceeded"), null, 0xbbc);
            }
            int requestLengthDiskThresholdBytes = httpRuntime.RequestLengthDiskThresholdBytes;
            HttpRawUploadedContent data = new HttpRawUploadedContent(requestLengthDiskThresholdBytes, this.ContentLength);
            byte[] preloadedEntityBody = this._wr.GetPreloadedEntityBody();
            if (preloadedEntityBody != null)
            {
                this._wr.UpdateRequestCounters(preloadedEntityBody.Length);
                data.AddBytes(preloadedEntityBody, 0, preloadedEntityBody.Length);
            }
            if (!this._wr.IsEntireEntityBodyIsPreloaded())
            {
                int num3 = (this.ContentLength > 0) ? (this.ContentLength - data.Length) : 0x7fffffff;
                HttpApplication applicationInstance = this._context.ApplicationInstance;
                byte[] buffer = (applicationInstance != null) ? applicationInstance.EntityBuffer : new byte[0x2000];
                int length = data.Length;
                while (num3 > 0)
                {
                    int size = buffer.Length;
                    if (size > num3)
                    {
                        size = num3;
                    }
                    int bytesIn = this._wr.ReadEntityBody(buffer, size);
                    if (bytesIn <= 0)
                    {
                        break;
                    }
                    this._wr.UpdateRequestCounters(bytesIn);
                    this.NeedToInsertEntityBody = true;
                    data.AddBytes(buffer, 0, bytesIn);
                    num3 -= bytesIn;
                    length += bytesIn;
                    if (length > maxRequestLengthBytes)
                    {
                        throw new HttpException(System.Web.SR.GetString("Max_request_length_exceeded"), null, 0xbbc);
                    }
                }
            }
            data.DoneAddingBytes();
            if ((this._installedFilter != null) && (data.Length > 0))
            {
                try
                {
                    try
                    {
                        this._filterSource.SetContent(data);
                        HttpRawUploadedContent content2 = new HttpRawUploadedContent(requestLengthDiskThresholdBytes, data.Length);
                        HttpApplication application2 = this._context.ApplicationInstance;
                        byte[] buffer3 = (application2 != null) ? application2.EntityBuffer : new byte[0x2000];
                        while (true)
                        {
                            int num7 = this._installedFilter.Read(buffer3, 0, buffer3.Length);
                            if (num7 == 0)
                            {
                                break;
                            }
                            content2.AddBytes(buffer3, 0, num7);
                        }
                        content2.DoneAddingBytes();
                        data = content2;
                    }
                    finally
                    {
                        this._filterSource.SetContent(null);
                    }
                }
                catch
                {
                    throw;
                }
            }
            this._rawContent = data;
        }
        return this._rawContent;
    }

这篇关于的maxRequestLength - 幕后细节需要!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆