2017-07-24 89 views
0

我使用JMeter 3.2來測試我的網站。我已經使用了2個以前的版本,所以我有一些線索我在做什麼。JMeter 3.2文件上傳命中ASP.Net爲空文件

我正在測試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請求中更改名稱來測試它,它給了我「未找到文件」IOException)。

我重新記錄了使用內部路徑的過程,看看是否有所作爲。它沒有。錄製時仍然失敗。播放請求現在確實將引用者顯示爲HTTP內部IP。但是播放仍會返回故障頁面(自錄製過程中顯示故障頁面以來,這是一個令人震驚的故事)。

我看着多個「如何上傳JMeter中的文件」頁面,他們都說我正在做什麼。大多數網頁從不說他們指的是什麼版本。

我將調試級別設置爲調試並再次播放它。在日誌文件中,我可以看到標題和文件內容。這是可讀的文本,不base64或壓縮(但我認爲沒關係,在Fiddler中文件內容也是可讀的)。文件名在預期的標題中。

所以它看起來像日誌發送的一切,但它沒有把它送到服務器(在記錄或回放過程中)。發生什麼了?

編輯:

從提琴手在頭:

手動(作品) 的Content-Length:9212 連接:保持活=

JMeter的(不工作) 內容 - 長度:9188 內容類型包含字符集= US-ASCII 連接:keep = alive 連接:保持活動

我不是專家,但我不認爲保持活力的額外大寫版本會影響任何東西。 我也懷疑charset seccification會影響任何東西。

TextView中的內容看起來與我完全相同。 Raw視圖中的內容具有不同順序的標題,但它們基本相同(在JMeter中額外保留活動)。

內容長度不包含標題,但主體看起來與邊界以外完全相同。 字節差異來自邊界長度的差異。 它在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"); 
    ... 
} 

的日誌條目說:「進入UploadFile與空文件名」。

在常規的圖形用戶界面有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

點擊左下角的文件上傳。我在郵編中加入了一個日誌。

爲了防萬一它是一個Firefox的問題,我試圖在IE中錄製,並有同樣的問題。 編輯4:

我將測試應用程序加載到另一個web服務器上(只是爲了確保它不是原始服務器阻塞的東西)。我在那裏得到了同樣的結果。

幫助別人使用上述測試程序:

因此,建立上述(視覺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就緒編譯的網站。 (將其解壓縮到inetpub並將文件夾升級到應用程序)

Temp: 具有jmeter腳本和上載文件。

在JMeter中將HTTP請求默認值更改爲Web服務器的IP地址 我有一個快捷方式可以從Temp文件夾運行jmeterw.cmd。 (我不確定是否驅動FileServerBase與否,但我的文件被發現)

雖然我仍然不確定它是JMeter錯誤還是IIS/ASP錯誤。

編輯7,但在正常和記錄不:

包從客戶端和服務器Packet Captures

我剛剛注意到,播放了「二進制內容傳輸編碼」捕捉。但是,在這種情況下,以二進制方式上傳應該沒問題。即使類型錯誤,損壞的文件仍然會打到服務器。

編輯8:

唯一的區別,我可以看到的是:

JMeter的補充 「的charset = US-ASCII」 的內容類型

JMeter的增加了「內容傳輸編碼:二進制」僅在播放

JMeter的邊界是32個字符,並隨機

手冊/工作邊界40個字符,並開始瓦特ith很多破折號

Wireshark捕獲顯示我的示例文件的JMeter帖子總是4幀。大約650字節,1450,180,38。在最後一幀中,結束邊界本身幾乎是自己的。 (從我的所有失敗捕獲,第三幀總是180,其他人轉移一點)

我的示例文件的手動帖子總是3幀。大約450,1450,370。

恕我直言,字符集和二進制文件應該沒有關係。我不認爲幀數應該重要。但在這一點上,我正在接近爲什麼這不起作用。邊界長度是否真的與它有關?

回答

0

您已經使用Fiddler記錄了JMeter發起的請求,現在使用真實瀏覽器記錄相同的請求,並檢查這兩個請求以找出任何差異。

請求應該是相同的(除了boundaryASP.NET_SessionId),如果它們不是 - 您將需要相應地修改JMeter配置。

我的期望是,你錯過了一些correlation ASP.NET Web應用程序廣泛使用,即__VIEWSTATE__EVENTVALIDATION動態參數,我沒有看到他們的任何跡象。

如果相同的場景適用於較早的JMeter版本,並且不適用於JMeter 3.2,則可能是迴歸問題,需要通過JMeter Issue Tracker進行報告。

+0

我上面做了一些修改。 – isopropanol