亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ASP.NET - 上傳非常大的文件時無法立即獲得錯誤響應?

ASP.NET - 上傳非常大的文件時無法立即獲得錯誤響應?

C#
森欄 2023-07-09 17:23:40
當我使用 Postman 嘗試將大文件上傳到我的服務器(用 .NET Core 2.2 編寫)時,Postman 立即顯示錯誤HTTP Error 404.13 - Not Found:The request filtering module is configured to deny a request that exceeds the request content length但是,當我使用代碼上傳那個大文件時,它會卡在發送文件的線路上。我的客戶代碼:    public async void TestUpload() {        StreamContent streamContent = new StreamContent(File.OpenRead("D:/Desktop/large.zip"));        streamContent.Headers.Add("Content-Disposition", "form-data; name=\"file\"; filename=\"large.zip\"");        MultipartFormDataContent multipartFormDataContent = new MultipartFormDataContent();        multipartFormDataContent.Add(streamContent);        HttpClient httpClient = new HttpClient();        Uri uri = new Uri("https://localhost:44334/api/user/testupload");        try {            HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(uri, multipartFormDataContent);            bool success = httpResponseMessage.IsSuccessStatusCode;        }        catch (Exception ex) {        }    }我的客戶端代碼卡在了 line HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(uri, multipartFormDataContent),而服務器沒有收到任何請求(我使用斷點來確保這一點)。如果文件較大,它會卡住更長時間。查看任務管理器,我可以看到我的客戶端程序使用了大量的 CPU 和磁盤,因為它實際上是將文件上傳到服務器。過了一會兒,代碼移動到下一行,即bool success = httpResponseMessage.IsSuccessStatusCode然后通過閱讀響應內容,我得到了與Postman完全相同的結果?,F在我想知道如何立即獲取錯誤以便能夠及時通知用戶,我不想等待很長時間。請注意,當我使用 Postman 上傳大文件時,我的服務器也沒有收到任何請求。我想我錯過了一些東西,也許我的客戶端代碼有問題。編輯:實際上我認為這是客戶端錯誤。但如果是服務器端錯誤,那么對我來說仍然沒有太大意義。因為,讓我理清思路。我想創建這個可以跨項目使用的小助手類,也許我也可以與我的朋友分享。所以我認為它應該能夠像Postman一樣,盡快確定錯誤。如果郵遞員能做到,我也能。EDIT2:很奇怪,今天我發現郵遞員事先不知道服務器是否接受大請求,我上傳了一個大文件,我看到它實際上將整個文件發送到服務器,直到得到響應?,F在我不再相信自己了,為什么我認為郵遞員提前知道錯誤,我一定是愚蠢的。但這確實意味著我找到了一種比 Postman 更好的方法來完成我的工作,所以我認為這個問題可能對某人有用。
查看完整描述

2 回答

?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

您的問題與服務器端 C# 代碼無關。由于客戶端和服務器之間發生的事情(我所說的“服務器”是指 IIS、Apache、Nginx...,而不是服務器端代碼),您的請求會被卡住。

在 HTTP 中,大多數客戶端在發送所有請求數據之前不會讀取響應。因此,即使您的服務器發現請求太大并返回錯誤響應,客戶端也不會讀取該響應,直到服務器接受整個請求。

當涉及到服務器端時,您可以檢查這個問題,但我認為在客戶端處理它會更方便,通過在將文件發送到服務器之前檢查文件大小(這基本上是Postman在做的事情)你的情況)。


查看完整回答
反對 回復 2023-07-09
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

你的信息確實幫助我思考如何做我想做的事。

我正在做的是:

  1. 首先,創建一個空ByteArrayContent請求,其中包含ContentLength我要上傳到服務器的文件的名稱。

  2. 二是HttpResponseMessage = await HttpClient.SendAsync(HttpRequestMessage)圍成一圈try-catch。該catch塊被捕獲,HttpRequestException因為我正在發送一個帶有文件長度的請求,但我的實際內容長度是 0,所以它會拋出一個HttpRequestException帶有消息的Cannot close stream until all bytes are written。

  3. 如果代碼到達該catch塊,則意味著服務器允許文件大小或更大的請求。如果沒有異常并且代碼移動到下一行,那么如果HttpResponseMessage.StatusCode404,則意味著服務器拒絕大于文件大小的請求。HttpResponseMessage.StatusCode不是404 的情況永遠不會發生(不過我不確定這一點)。

到目前為止我的最終代碼:

? ? private async Task<bool> IsBigRequestAllowed() {

? ? ? ? FileStream fileStream = File.Open("D:/Desktop/big.zip", FileMode.Open, FileAccess.Read, FileShare.Read);

? ? ? ? if(fileStream.Length == 0) {

? ? ? ? ? ? fileStream.Close();

? ? ? ? ? ? return true;

? ? ? ? }

? ? ? ? HttpRequestMessage = new HttpRequestMessage();

? ? ? ? HttpMethod = HttpMethod.Post;

? ? ? ? HttpRequestMessage.Method = HttpMethod;

? ? ? ? HttpRequestMessage.RequestUri = new Uri("https://localhost:55555/api/user/testupload");

? ? ? ? HttpRequestMessage.Content = new ByteArrayContent(new byte[] { });

? ? ? ? HttpRequestMessage.Content.Headers.ContentLength = fileStream.Length;

? ? ? ? fileStream.Close();

? ? ? ? try {

? ? ? ? ? ? HttpResponseMessage = await HttpClient.SendAsync(HttpRequestMessage);

? ? ? ? ? ? if (HttpResponseMessage.StatusCode == HttpStatusCode.NotFound) {

? ? ? ? ? ? ? ? return false;

? ? ? ? ? ? }

? ? ? ? ? ? return true; // The code will never reach this line though

? ? ? ? }

? ? ? ? catch(HttpRequestException) {

? ? ? ? ? ? return true;

? ? ? ? }

? ? }

注意:請注意,我的方法仍然存在問題。我的代碼的問題是ContentLength屬性,它不應該是文件的長度,它應該更大。例如,如果我的文件長度正好是1000字節,那么如果文件成功上傳到服務器,那么Request服務器獲取到的ContentLength值就更大。因為它HttpClient不僅僅發送文件的內容,還必須另外發送很多信息。它必須發送邊界、內容類型、連字符、換行符等...一般來說,您應該事先找出將與文件一起發送的確切字節,HttpClient以使這種方法完美工作(我仍然不這樣做)到目前為止我還不知道,我的時間已經不多了。我稍后會找出并更新我的答案)。


現在,我可以立即提前確定服務器是否可以接受與用戶想要上傳的文件一樣大的請求。


查看完整回答
反對 回復 2023-07-09
  • 2 回答
  • 0 關注
  • 198 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號