2 回答

TA貢獻1804條經驗 獲得超3個贊
您的問題與服務器端 C# 代碼無關。由于客戶端和服務器之間發生的事情(我所說的“服務器”是指 IIS、Apache、Nginx...,而不是服務器端代碼),您的請求會被卡住。
在 HTTP 中,大多數客戶端在發送所有請求數據之前不會讀取響應。因此,即使您的服務器發現請求太大并返回錯誤響應,客戶端也不會讀取該響應,直到服務器接受整個請求。
當涉及到服務器端時,您可以檢查這個問題,但我認為在客戶端處理它會更方便,通過在將文件發送到服務器之前檢查文件大小(這基本上是Postman在做的事情)你的情況)。

TA貢獻1829條經驗 獲得超9個贊
你的信息確實幫助我思考如何做我想做的事。
我正在做的是:
首先,創建一個空
ByteArrayContent
請求,其中包含ContentLength
我要上傳到服務器的文件的名稱。二是
HttpResponseMessage = await HttpClient.SendAsync(HttpRequestMessage)
圍成一圈try-catch
。該catch
塊被捕獲,HttpRequestException
因為我正在發送一個帶有文件長度的請求,但我的實際內容長度是 0,所以它會拋出一個HttpRequestException
帶有消息的Cannot close stream until all bytes are written
。如果代碼到達該
catch
塊,則意味著服務器允許文件大小或更大的請求。如果沒有異常并且代碼移動到下一行,那么如果HttpResponseMessage.StatusCode
是404,則意味著服務器拒絕大于文件大小的請求。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以使這種方法完美工作(我仍然不這樣做)到目前為止我還不知道,我的時間已經不多了。我稍后會找出并更新我的答案)。
現在,我可以立即提前確定服務器是否可以接受與用戶想要上傳的文件一樣大的請求。
- 2 回答
- 0 關注
- 198 瀏覽
添加回答
舉報