我使用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
如果我断开代理并上传文件就可以了。
如果我停止录制,请将监听器更改为简单控制器,然后播放录制的会话,我可以看到"失败"页面回来了。这是一个响应状态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请求中的名称来测试它,它给了我&#34;找不到文件&#34; IOException )。
我使用内部路径重新录制了该过程,看看是否有所作为。它没有。录音时仍然失败。回放请求现在确实将引用者显示为HTTP内部IP。但是播放仍然会返回失败页面(自录制期间显示失败页面以来的震撼)。
我查看了多个&#34;如何在JMeter中上传文件&#34;页面,他们都说我正在做的事情。大多数网页从不会说出他们所指的版本。
我将Debug Level设置为Debug并再次播放。在日志文件中,我看到标题和文件内容。它是可读的文本,而不是base64或zipped(但我认为没问题。在Fiddler中,文件内容也是可读的)。文件名按预期在标题中。
所以看起来日志正在发送所有内容,但它没有发送到服务器(在录制和播放期间)。那是怎么回事?
编辑:
来自标题中的小提琴手:
手动(工作) 内容长度:9212 连接:keep = alive
JMeter(不工作) 内容长度:9188 Content-Type包含charset = US-ASCII 连接:keep = alive 连接: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");
...
}
日志条目是&#34;使用空文件名输入UploadFile&#34;。
在常规GUI上,javascript会阻止您在不附加文件的情况下提交。 JMeter没有运行js,但是一切都告诉我JMeter正在发送文件。
我添加到了web.config,这没什么区别。
IIS / ASP上还有哪些允许函数调用但阻止文件?
我有另一个文件上传,其中函数没有参数,它到达Request对象。
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。我看到了&#34;服务器400错误请求:请求形成错误&#34;错误。当我录音时。
http://s000.tinyupload.com/?file_id=76890258829912351911
然后显示帖子的数据包看起来像垃圾(突出显示的帖子长度96)。在手动运行中,我可以看到上传文件的文本(请参阅长度为907的帖子)。由于我上传的文件的性质,我无法上传此捕获,但如果有人想查看它,我可以使用可共享文件重复此操作。
编辑6: 我在&#34;上传后添加了详细信息&#34;示例网站中的页面。
我还使用示例站点的源代码,编译的站点和JMeter脚本进行了一次大的上传。
Visual Studio 2015: 在项目下我压缩了WebApplication1源代码
日志: 我有一个示例日志文件,其中包含有关结果的说明。 我有压缩的IIS-ready编译网站。 (将其解压缩到inetpub并将文件夹提升为应用程序)
温度: 有jmeter脚本和上传文件。
在JMeter中,将HTTP Request Default更改为Web服务器的IP 我有一个从Temp文件夹运行jmeterw.cmd的快捷方式。 (我不确定是否会驱动FileServerBase,但是找到了我的文件)
虽然我还不确定它是否是JMeter错误或IIS / ASP错误。
编辑7:
来自客户端和服务器Packet Captures
的数据包捕获我刚刚注意到播放有&#34;内容传输编码:二进制&#34;,但是正常,而录制没有。但是,在这种情况下,上传为二进制文件应该没问题。即使Type类型错误,损坏的文件仍然会命中服务器。
编辑8:
我能看到的唯一区别是:
JMeter添加&#34; charset = US-ASCII&#34;在内容类型
JMeter添加&#34;内容传输编码:二进制&#34;仅在播放时
JMeter边界是32个字符,随机
手动/工作边界为40个字符,以大量破折号开头
Wireshark捕获显示我的示例文件的JMeter帖子总是4帧。大约650字节,1450,180,38。结束边界几乎在最后一帧中。 (从我的所有失败捕获中,第三帧始终为180,其他帧移动了一点)
我的示例文件的手动帖子总是3帧。大约450,1450,370。
恕我直言,字符集和二进制文件并不重要。我不认为帧数很重要。但在这一点上,我正在寻找秸秆,为什么这不起作用。边界长度真的与它有关吗?
答案 0 :(得分:0)
您已使用Fiddler记录了JMeter发起的请求,现在使用真实浏览器记录相同的请求并检查这两个请求以找出任何差异。
请求应该相同(除了boundary
和ASP.NET_SessionId
),如果不是 - 您需要相应地修改JMeter配置。
我的期望是你错过了一些correlation,因为ASP.NET网络应用程序广泛使用,即__VIEWSTATE和__EVENTVALIDATION动态参数,我没有看到它们的任何迹象。
如果相同的方案适用于早期的JMeter版本且不适用于JMeter 3.2,则可能是回归问题,需要通过JMeter Issue Tracker进行报告。
答案 1 :(得分:0)
我也观察到相同的问题,并通过参考以下链接解决了 How to send a POST request a file with Content-Type: application/octet-stream in Node js
只需选择http sampler的“使用multipartform-data用于POST”选项,然后从标题中删除内容类型