【问题标题】:HttpContext.Request.ContentLength is always 0 for PUT? (But valid for POST)PUT 的 HttpContext.Request.ContentLength 始终为 0? (但对 POST 有效)
【发布时间】:2019-05-16 16:21:50
【问题描述】:

我的网站接受文件上传。文件可以通过 WebDAV (PUT) 或通过 POST 上传。对于 POST,我的 HttpModule 拦截请求并将 POST 的 BODY 保存到服务器上的文件中。对于 PUT,WebDAV 处理文件的创建。

我的 HttpModule 还会在其 OnEndRequest 事件处理程序中记录每个文件上传。

我发现 FOR PUTs (WebDAV) 两者都有

 ctx.Request.Headers["Content-Length"]
 ctx.Request.ContentLength

总是等于 0,尽管对于 POST,这两者都包含正文内容的长度。

如何获取通过 WebDAV 上传的文件的长度?

【问题讨论】:

    标签: iis webdav httpmodule


    【解决方案1】:

    当我写这篇文章时,我意识到对于 PUT,我知道 PUT 到服务器的文件的名称。所以我用下面的代码解决了这个问题:

      if (ctx.Request.ContentLength == 0)
      {
          if (ctx.Request.HttpMethod == "PUT")
          {
              FileInfo fi = new FileInfo(ctx.Items["OutFile"].ToString());
              fileSize = fi.Length;
          }
      }
      else
      {
          fileSize = ctx.Request.ContentLength;
      }
    

    (其中 ctx.Items["OutFile"] 是我从以前的事件处理程序中保留的文件的名称。)

    所以现在这对我有用。尽管如此,能够在不必进入文件系统的情况下获得这些信息会很好。如果您知道我如何从当前正在执行的 http 事务的上下文中获取它,我将不胜感激您的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2020-02-06
      • 2023-03-14
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多