第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

ASP.NET - 上傳非常大的文件時(shí)無法立即獲得錯(cuò)誤響應(yīng)?

ASP.NET - 上傳非常大的文件時(shí)無法立即獲得錯(cuò)誤響應(yīng)?

C#
森欄 2023-07-09 17:23:40
當(dāng)我使用 Postman 嘗試將大文件上傳到我的服務(wù)器(用 .NET Core 2.2 編寫)時(shí),Postman 立即顯示錯(cuò)誤HTTP Error 404.13 - Not Found:The request filtering module is configured to deny a request that exceeds the request content length但是,當(dāng)我使用代碼上傳那個(gè)大文件時(shí),它會(huì)卡在發(fā)送文件的線路上。我的客戶代碼:    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),而服務(wù)器沒有收到任何請求(我使用斷點(diǎn)來確保這一點(diǎn))。如果文件較大,它會(huì)卡住更長時(shí)間。查看任務(wù)管理器,我可以看到我的客戶端程序使用了大量的 CPU 和磁盤,因?yàn)樗鼘?shí)際上是將文件上傳到服務(wù)器。過了一會(huì)兒,代碼移動(dòng)到下一行,即bool success = httpResponseMessage.IsSuccessStatusCode然后通過閱讀響應(yīng)內(nèi)容,我得到了與Postman完全相同的結(jié)果?,F(xiàn)在我想知道如何立即獲取錯(cuò)誤以便能夠及時(shí)通知用戶,我不想等待很長時(shí)間。請注意,當(dāng)我使用 Postman 上傳大文件時(shí),我的服務(wù)器也沒有收到任何請求。我想我錯(cuò)過了一些東西,也許我的客戶端代碼有問題。編輯:實(shí)際上我認(rèn)為這是客戶端錯(cuò)誤。但如果是服務(wù)器端錯(cuò)誤,那么對我來說仍然沒有太大意義。因?yàn)椋屛依砬逅悸?。我想?chuàng)建這個(gè)可以跨項(xiàng)目使用的小助手類,也許我也可以與我的朋友分享。所以我認(rèn)為它應(yīng)該能夠像Postman一樣,盡快確定錯(cuò)誤。如果郵遞員能做到,我也能。EDIT2:很奇怪,今天我發(fā)現(xiàn)郵遞員事先不知道服務(wù)器是否接受大請求,我上傳了一個(gè)大文件,我看到它實(shí)際上將整個(gè)文件發(fā)送到服務(wù)器,直到得到響應(yīng)?,F(xiàn)在我不再相信自己了,為什么我認(rèn)為郵遞員提前知道錯(cuò)誤,我一定是愚蠢的。但這確實(shí)意味著我找到了一種比 Postman 更好的方法來完成我的工作,所以我認(rèn)為這個(gè)問題可能對某人有用。
查看完整描述

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在做的事情)你的情況)。


查看完整回答
反對 回復(fù) 2023-07-09
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

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

我正在做的是:

  1. 首先,創(chuàng)建一個(gè)空ByteArrayContent請求,其中包含ContentLength我要上傳到服務(wù)器的文件的名稱。

  2. 二是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。

  3. 如果代碼到達(dá)該catch塊,則意味著服務(wù)器允許文件大小或更大的請求。如果沒有異常并且代碼移動(dòng)到下一行,那么如果HttpResponseMessage.StatusCode404,則意味著服務(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ù)器是否可以接受與用戶想要上傳的文件一樣大的請求。


查看完整回答
反對 回復(fù) 2023-07-09
  • 2 回答
  • 0 關(guān)注
  • 194 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號