Asp.net 从C代码增加Http运行时MaxRequestLength

Asp.net 从C代码增加Http运行时MaxRequestLength,asp.net,Asp.net,我怎样才能增加工资 从我的C代码?我无法在Web.config中执行此操作,我的应用程序是为部署Web而创建的 IIS中的应用程序。您可以在web.config中执行此操作 <httpRuntime maxRequestLength="11000" /> 11000==11MB看看 下面是访问HttpRuntimeAction实例的方法。然后修改属性MaxRequestLength。增加最大请求长度的替代方法是创建IHttpModule实现。在BeginRequest处理程序中

我怎样才能增加工资

从我的C代码?我无法在Web.config中执行此操作,我的应用程序是为部署Web而创建的
IIS中的应用程序。

您可以在web.config中执行此操作

<httpRuntime maxRequestLength="11000" />

11000==11MB看看


下面是访问HttpRuntimeAction实例的方法。然后修改属性MaxRequestLength。

增加最大请求长度的替代方法是创建IHttpModule实现。在BeginRequest处理程序中,获取HttpWorkerRequest以在您自己的代码中完全处理它,而不是让默认实现处理它

下面是一个基本实现,它将处理发送到任何名为“dropbox.aspx”的文件(在任何目录中,无论是否存在)的任何请求:

例如,如果您正在实现一个文件上传程序,并且希望在接收到多部分内容流时对其进行处理,那么您可以使用类似的方法,这样您就可以基于发布的表单字段执行身份验证,更重要的是,在接收任何文件数据之前取消服务器端的请求。如果您可以在流的早期确定上载未经授权,或者文件太大或超过用户的dropbox磁盘配额,则可以节省大量时间

对于默认实现,这是不可能的,因为尝试访问HttpRequest的Form属性将导致它尝试接收整个请求流,并完成MaxRequestLength检查。HttpRequest对象有一个名为“GetEntireRawContent”的方法,该方法在需要访问内容时立即调用。该方法以以下代码开头:

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(SR.GetString("Max_request_length_exceeded"), null, 0xbbc);
}
关键是,您将跳过该代码,转而实现自己的自定义内容长度检查。如果您使用Reflector查看“GetEntireRawContent”的其余部分并将其用作模型实现,您将看到它基本上执行以下操作:调用GetPrepreadendEntityBody,通过调用IsEntireEntityBodysPreload检查是否还有更多要加载的内容,最后循环调用ReadEntityBody以获取其余的数据。GetPrepreadendEntityBody和ReadEntityBody读取的数据被转储到专门的流中,一旦临时文件超过大小阈值,该流将自动使用临时文件作为备份存储

基本实现如下所示:

MemoryStream request_content = new MemoryStream();
int bytesRemaining = wr.GetTotalEntityBodyLength() - wr.GetPreloadedEntityBodyLength();
byte[] preloaded_data = wr.GetPreloadedEntityBody();
if (preloaded_data != null)
    request_content.Write( preloaded_data, 0, preloaded_data.Length );
if (!wr.IsEntireEntityBodyIsPreloaded()) //not a type-o, they use "Is" redundantly in the 
{
    int BUFFER_SIZE = 0x2000; //8K buffer or whatever
    byte[] buffer = new byte[BUFFER_SIZE];
    while (bytesRemaining > 0)
    {
        bytesRead = wr.ReadEntityBody(buffer, Math.Min( bytesRemaining, BUFFER_SIZE )); //Read another set of bytes
        bytesRemaining -= bytesRead; // Update the bytes remaining
        request_content.Write( buffer, 0, bytesRead ); // Write the chunks to the backing store (memory stream or whatever you want)
    }
    if (bytesRead == 0) //failure to read or nothing left to read
        break;
}
在这一点上,您将在MemoryStream中获得整个请求。然而,我所做的不是像那样下载整个请求,而是将“byteslaining”循环卸载到具有“readough(int max_index)”方法的类中,该方法根据需要从专门的MemoryStream中调用,该MemoryStream“加载足够多”到流中,以访问被访问的字节


最终,该体系结构允许我将请求直接发送到从内存流读取的解析器,并且内存流根据需要自动从工作者请求加载更多数据。我还实现了事件,这样在解析多部分内容流的每个元素时,当每个新部分被识别并且每个部分都被完全接收时,它就会触发事件。

在web.config中无法根据问题执行。您是否有权访问
machine.config
文件?+1。顺便说一句,PROTIP:不要将null发送到
WebConfigurationManager.OpenWebConfiguration(path)
。如果为空,则打开根Web.config这句话似乎不是我所期望的意思,我必须发送“~”以从根目录中的Web.config获取值。
MemoryStream request_content = new MemoryStream();
int bytesRemaining = wr.GetTotalEntityBodyLength() - wr.GetPreloadedEntityBodyLength();
byte[] preloaded_data = wr.GetPreloadedEntityBody();
if (preloaded_data != null)
    request_content.Write( preloaded_data, 0, preloaded_data.Length );
if (!wr.IsEntireEntityBodyIsPreloaded()) //not a type-o, they use "Is" redundantly in the 
{
    int BUFFER_SIZE = 0x2000; //8K buffer or whatever
    byte[] buffer = new byte[BUFFER_SIZE];
    while (bytesRemaining > 0)
    {
        bytesRead = wr.ReadEntityBody(buffer, Math.Min( bytesRemaining, BUFFER_SIZE )); //Read another set of bytes
        bytesRemaining -= bytesRead; // Update the bytes remaining
        request_content.Write( buffer, 0, bytesRead ); // Write the chunks to the backing store (memory stream or whatever you want)
    }
    if (bytesRead == 0) //failure to read or nothing left to read
        break;
}