【问题标题】:JMeter 3.2 file upload hitting ASP.Net as null fileJMeter 3.2文件上传击中ASP.Net作为空文件
【发布时间】:2017-12-30 16:00:40
【问题描述】:

我正在使用 JMeter 3.2 来测试我的网站。我用过 2 个以前的版本,所以我知道我在做什么。

我正在测试一个 ASP.NET 4.5 站点。

当我记录文件上传时,我得到一个“失败”页面,因为我的应用程序正在进入“文件上传”过程,但 HttpPostedFileBase 为空。

HTTP 请求已按照我的预期填写所有内容。

Method: POST
Path: the /context/controller/action as expected
Redirect Automatically unchecked
Follow Redirects, Use KeepAlive, Use mutipart/form-data for POST, and Browser-compatible headers checked
The File Path has the filename (no path info) as expected
The Parameter Name is correct
The MIME Type is correct

如果我断开代理并上传文件,它就可以正常工作。

如果我停止录制,请将侦听器更改为 Simple Controller,然后播放录制的会话,我可以看到“失败”页面返回。这是一个响应状态 200,因为它是一个用户友好的错误页面,但我添加了一个断言响应来捕获失败状态。

在查看结果树中,我的请求如下所示:

POST data:
--xr9jIAHNizYdrOAAzOIT6Yuvtp-zJlfaoDdNP
Content-Disposition: form-data; name="notInvolvedVariableName"

false
--xr9jIAHNizYdrOAAzOIT6Yuvtp-zJlfaoDdNP
Content-Disposition: form-data; name="fileUploadVariableName"; filename="JustFileName.txt"
Content-Type: text/plain

<actual file content, not shown here>
--xr9jIAHNizYdrOAAzOIT6Yuvtp-zJlfaoDdNP--

Cookie Data:
ASP.NET_SessionId=sessionIDblabla

Request Headers:
Connection: keep-alive
Referer: THIS_STILL_HAS_HTTPS_AND_EXTERNAL_SERVER_IP_FROM_WHEN_I_RECORDED_THE_UPLOAD/UploadFile
Accept-Language: en-US,en;q=0.5
DNT: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate, br
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0
Content-Length: 9203
Content-Type: multipart/form-data; boundary=xr9jIAHNizYdrOAAzOIT6Yuvtp-zJlfaoDdNP; charset=UTF-8
Host: INTERNAL_IP

我想知道通过 HTTPS 录制是否在错误中起作用。

我知道我的 FileServer Base 指向正确的文件夹(通过检查 jmeter.log 文件并通过更改我的 HTTP 请求中的名称来测试它,这给了我“找不到文件”IOException)。

我使用内部路径重新记录了该过程,看看是否有所不同。它没有。录制的时候还是失败了。播放请求现在确实将引用者显示为 HTTP 内部 IP。但是播放仍然返回失败页面(令人震惊,因为在录制过程中显示了失败页面)。

我查看了多个“如何在 JMeter 中上传文件”页面,它们都准确地说明了我在做什么。大多数页面从不说明他们指的是哪个版本。

我将调试级别设置为调试并再次播放。在日志文件中,我看到了标题和文件内容。它是可读的文本,不是 base64 或压缩的(但我认为没关系。在 Fiddler 中,文件内容也是可读的)。文件名按预期在标题中。

所以看起来日志正在发送所有内容,但它没有发送到服务器(在录制或播放期间)。那到底是怎么回事?

编辑:

来自标题中的提琴手:

手动(有效) 内容长度:9212 连接:keep=alive

JMeter(不起作用) 内容长度:9188 Content-Type 包含 charset=US-ASCII 连接:保持=活动 连接:保持活动状态

我不是专家,但我认为keep alive 的大写版本不会影响任何事情。 我也怀疑 charset sepcification 会影响任何东西。

TextView 中的内容看起来和我一模一样。 Raw 视图中的内容具有不同顺序的标题,但它们本质上都是相同的(在 JMeter 中有额外的 Keep Alive)。

内容长度不包括标题,但正文看起来与边界完全相同。 字节差异来自边界长度的差异。 在 JMeter 中为 32,手动为 40。它在内容中出现了 3 次,加起来是 24。每次运行的长度都会改变,所以我认为这不应该是原因。

所以我认为您的链接之一肯定是原因,因为看起来一切都正确发送。我很困惑为什么收到的方式不同,但我会仔细阅读,看看这对我有什么影响。

编辑 2:

我不认为这是一个相关性问题。

我的行动声明如下:

[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UploadFile(HttpPostedFileBase myFile)
{
    logger.DebugFormat("Entered UploadFile with {0}", myFile != null ? myFile.FileName : "null filename");
    ...
}

日志条目显示“Entered UploadFile with null filename”。

在常规 GUI 上,有 javascript 会阻止您在未附加文件的情​​况下提交。 JMeter 不运行 js,但一切都告诉我 JMeter 正在发送文件。

我添加到 web.config 中,没有任何区别。

IIS/ASP 上还有什么会允许函数调用但阻止文件?

我有另一个文件上传,该函数不带参数,它到达请求对象。

if (null != Request.Files && Request.Files.Count > 0)
{
    HttpPostedFileBase hpf = Request.Files[0];
}//if
else
{
    logger.DebugFormat("Entered UploadFile with null filename or 0 files");
}

那个也收不到文件。

编辑 3:

我创建了一个遇到此问题的示例应用程序。它记录到 C:\Logs。

注意:此链接已被以下链接取代。 http://s000.tinyupload.com/?file_id=49840904361057335433

点击左下角的文件上传。我在 zip 中包含了一个日志。

以防万一是 FireFox 问题,我尝试在 IE 中录制并遇到同样的问题。 编辑 4:

我将测试应用程序加载到另一个 Web 服务器上(只是为了确保它不是原始服务器阻止的东西)。我在那里得到了相同的结果。

为了帮助其他人使用上面的测试应用:

因此构建上面附加的应用程序 (Visual Sutio 2015)。
发布它(C:\Logs 是它将构建的位置)。 Zip Publish_WebApp1.
将其部署到 Web 服务器(我在第二台服务器上使用 IIS 10)。
尝试记录任何文件上传。
检查日志文件。
尝试在没有 jmeter 代理的情况下上传文件(用于比较)。

编辑 5: 我在第二台服务器上运行了 Wireshark。我看到“服务器 400 错误请求:请求格式错误”错误。当我在录音时。

http://s000.tinyupload.com/?file_id=76890258829912351911

然后显示帖子的数据包看起来像垃圾(突出显示的帖子长度为 96)。在手动运行中,我可以看到上传文件的文本(参见长度为 907 的帖子)。由于我上传的文件的性质,我无法上传此捕获,但如果有人想查看它,我可以使用可共享文件重复它。

编辑 6: 我在示例网站的“上传后”页面中添加了详细信息。

我还用示例站点、编译站点和 JMeter 脚本的源代码进行了一次大上传。

Sample Site with Code

Visual Studio 2015: 在项目下,我压缩了 WebApplication1 源代码

日志: 我有一个示例日志文件,其中包含有关结果的注释。 我有压缩的 IIS-ready 编译网站。 (将其解压到inetpub并将文件夹提升为应用程序)

温度: 有jmeter脚本和上传文件。

在 JMeter 中将您的 HTTP 请求默认更改为 Web 服务器的 IP 我有一个从 Temp 文件夹运行 jmeterw.cmd 的快捷方式。 (我不确定这是否会驱动 FileServerBase,但我的文件已找到)

虽然我仍然不确定这是 JMeter 错误还是 IIS/ASP 错误。

编辑 7:

从客户端和服务器捕获的数据包Packet Captures

我刚刚注意到播放有“内容传输编码:二进制”,但正常,录音没有。但是,在这种情况下,作为二进制文件上传应该没问题。即使类型错误,损坏的文件仍然会访问服务器。

编辑 8:

我能看到的唯一区别是:

JMeter 在 Content-Type 上添加“charset=US-ASCII”

JMeter 仅在播放时添加“Content-Transfer-Encoding: binary”

JMeter 边界是 32 个字符,并且是随机的

手动/工作边界为 40 个字符,以大量破折号开头

Wireshark 捕获显示我的示例文件的 JMeter 帖子始终为 4 帧。大约 650 字节,1450、180、38。在最后一帧中,结束边界几乎独自一人。 (从我所有的失败捕获中,第三帧总是 180,其他的有点偏移)

我的示例文件的手动帖子总是 3 帧。大约 450、1450、370。

恕我直言,字符集和二进制应该无关紧要。我不认为帧数应该重要。但在这一点上,我正在寻找为什么这不起作用的稻草。边界长度真的与它有关吗?

【问题讨论】:

    标签: asp.net upload jmeter


    【解决方案1】:

    您已经使用 Fiddler 记录了 JMeter 发起的请求,现在使用真实浏览器记录相同的请求并检查这两个请求以找出任何差异。

    请求应该是相同的(除了boundaryASP.NET_SessionId),如果它们不是 - 您将需要相应地修改 JMeter 配置。

    我的期望是您会错过一些 correlation,因为 ASP.NET Web 应用程序广泛使用,即 __VIEWSTATE__EVENTVALIDATION 动态参数,我看不到它们的任何迹象。

    如果相同的场景适用于早期的 JMeter 版本并且不适用于 JMeter 3.2,则可能是需要通过JMeter Issue Tracker 报告的回归问题。

    【讨论】:

      【解决方案2】:

      我也观察到同样的问题并通过参考以下链接解决 How to send a POST request a file with Content-Type: application/octet-stream in Node js

      只需选择http采样器的“使用多部分数据进行POST”选项并从标题中删除内容类型

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-12
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-21
        • 2012-03-13
        相关资源
        最近更新 更多