2 回答

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

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
你的信息確實(shí)幫助我思考如何做我想做的事。
我正在做的是:
首先,創(chuàng)建一個(gè)空
ByteArrayContent
請求,其中包含ContentLength
我要上傳到服務(wù)器的文件的名稱。二是
HttpResponseMessage = await HttpClient.SendAsync(HttpRequestMessage)
圍成一圈try-catch
。該catch
塊被捕獲,HttpRequestException
因?yàn)槲艺诎l(fā)送一個(gè)帶有文件長度的請求,但我的實(shí)際內(nèi)容長度是 0,所以它會(huì)拋出一個(gè)HttpRequestException
帶有消息的Cannot close stream until all bytes are written
。如果代碼到達(dá)該
catch
塊,則意味著服務(wù)器允許文件大小或更大的請求。如果沒有異常并且代碼移動(dòng)到下一行,那么如果HttpResponseMessage.StatusCode
是404,則意味著服務(wù)器拒絕大于文件大小的請求。HttpResponseMessage.StatusCode
不是404 的情況永遠(yuǎn)不會(huì)發(fā)生(不過我不確定這一點(diǎn))。
到目前為止我的最終代碼:
? ? 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屬性,它不應(yīng)該是文件的長度,它應(yīng)該更大。例如,如果我的文件長度正好是1000字節(jié),那么如果文件成功上傳到服務(wù)器,那么Request服務(wù)器獲取到的ContentLength值就更大。因?yàn)樗麳ttpClient不僅僅發(fā)送文件的內(nèi)容,還必須另外發(fā)送很多信息。它必須發(fā)送邊界、內(nèi)容類型、連字符、換行符等...一般來說,您應(yīng)該事先找出將與文件一起發(fā)送的確切字節(jié),HttpClient以使這種方法完美工作(我仍然不這樣做)到目前為止我還不知道,我的時(shí)間已經(jīng)不多了。我稍后會(huì)找出并更新我的答案)。
現(xiàn)在,我可以立即提前確定服務(wù)器是否可以接受與用戶想要上傳的文件一樣大的請求。
- 2 回答
- 0 關(guān)注
- 194 瀏覽
添加回答
舉報(bào)