https://www.cnblogs.com/ydchw/p/10840198.html
1. 超時問題(timeout)
這個和NetCore無關,是ajax請求忘記設置timeout參數值,在網頁端加上即可。
2. Request body too large 錯誤
Post的body大概超過30m就會報這個錯誤,完整的錯誤是Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request body too large
解決的方法有二種,一種是在請求的函數前加Attribute
[HttpPost("upload")] [RequestSizeLimit(100_000_000)] //最大100m左右 //[DisableRequestSizeLimit] //或者取消大小的限制 public async Task<string> UploadFiles(ModelTest test) {
還有一種方法是全局增加請求body的大小或者不限body的大小。
public static IWebHost BuildWebHost(string[] args) { var config = new ConfigurationBuilder() .AddCommandLine(args) .Build(); return WebHost.CreateDefaultBuilder(args).UseConfiguration(config) .UseStartup<Startup>().UseKestrel(options => { //所有controller都不限制post的body大小 options.Limits.MaxRequestBodySize = null; }) .Build(); }
3. Multipart body length limit 134217728 exceeded錯誤
Post的body大概超過100多M會碰到這個錯誤,完整的錯誤信息是 System.IO.InvalidDataException: Multipart body length limit 134217728 exceeded.
。
解決的方法是在startup.cs添加代碼:
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); //解決Multipart body length limit 134217728 exceeded services.Configure<FormOptions>(x => { x.ValueLengthLimit = int.MaxValue; x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart }); }
4. Nginx限制上傳大小的錯誤
通過Nginx端口映射,請求會先經過Nginx,也需要額外再設置一個參數client_max_body_size
,否則上傳大文件也會有問題
location ^~ /sample2/ {
rewrite ^/sample2/(.*)$ /$1 break; proxy_pass http://localhost:5556; client_max_body_size 300m; #最大接受300m文件以內的 }
5. 上傳七牛大文件問題
使用七牛的SDK上傳一般小文件很簡單,但是上傳大文件就需要使用分片上傳了,否則會返回錯誤-256
錯誤
以下是正常上傳和分片上傳的2個函數,大家可以參考
//適應一般小文件 public HttpResult uploadByte(string saveKeys, byte[] data) { Config.AutoZone(AK, bucket, false); Mac mac = new Mac(AK, SK); string saveKey = saveKeys; PutPolicy putPolicy = new PutPolicy(); // 如果需要設置為"覆蓋"上傳(如果雲端已有同名文件則覆蓋),請使用 SCOPE = "BUCKET:KEY" putPolicy.Scope = bucket + ":" + saveKey; //putPolicy.Scope = bucket; // 上傳策略有效期(對應於生成的憑證的有效期) putPolicy.SetExpires(100000); string jstr = putPolicy.ToJsonString(); string token = Auth.CreateUploadToken(mac, jstr); FormUploader fu = new FormUploader(); HttpResult result = fu.UploadData(data, saveKey, token); return result; } //適用於大文件上傳 public HttpResult UploadBigFile(string saveKeys, byte[] data) { Config.AutoZone(AK, bucket, false); // 這個示例單獨使用了一個Settings類,其中包含AccessKey和SecretKey // 實際應用中,請自行設置您的AccessKey和SecretKey Mac mac = new Mac(AK, SK); // 斷點記錄文件,可以不用設置,讓SDK自動生成,如果出現續上傳的情況,SDK會嘗試從該文件載入斷點記錄 // 對於不同的上傳任務,請使用不同的recordFile PutPolicy putPolicy = new PutPolicy(); // 如果需要設置為"覆蓋"上傳(如果雲端已有同名文件則覆蓋),請使用 SCOPE = "BUCKET:KEY" putPolicy.Scope = bucket + ":" + saveKeys; //putPolicy.Scope = bucket; // 上傳策略有效期(對應於生成的憑證的有效期) putPolicy.SetExpires(100000); string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); // 包含兩個參數,並且都有默認值 // 參數1(bool): uploadFromCDN是否從CDN加速上傳,默認否 // 參數2(enum): chunkUnit上傳分片大小,可選值128KB,256KB,512KB,1024KB,2048KB,4096KB ResumableUploader ru = new ResumableUploader(false, ChunkUnit.U1024K); // ResumableUploader.UploadFile有多種形式,您可以根據需要來選擇 // // 最簡模式,使用默認recordFile和默認uploadProgressHandler // UploadFile(localFile,saveKey,token) // // 基本模式,使用默認uploadProgressHandler // UploadFile(localFile,saveKey,token,recordFile) // // 一般模式,使用自定義進度處理(可以監視上傳進度) // UploadFile(localFile,saveKey,token,recordFile,uploadProgressHandler) // // 高級模式,包含上傳控制(可控制暫停/繼續 或者強制終止) // UploadFile(localFile,saveKey,token,recordFile,uploadProgressHandler,uploadController) // // 支持自定義參數 //var extra = new System.Collections.Generic.Dictionary<string, string>(); //extra.Add("FileType", "UploadFromLocal"); //extra.Add("YourKey", "YourValue"); //uploadFile(...,extra,...) //最大嘗試次數(有效值1~20),在上傳過程中(如mkblk或者bput操作)如果發生錯誤,它將自動重試,如果沒有錯誤則無需重試 int maxTry = 10; // 使用默認進度處理,使用自定義上傳控制 UploadProgressHandler upph = new UploadProgressHandler(ResumableUploader.DefaultUploadProgressHandler); HttpResult result = ru.UploadData(data, saveKeys, token, upph); return result; }
- 問題描述 在IIS上部署一個可以接受文件上傳的netCore WebApi,使用`Http`驗證時沒有任何問題,使用`SSL`后;通過微信小程序Post文件流,就會導致異常:`未顯示頁面 因為請求實體過大`的413 錯誤;但是在 Chrome 內核的微信小程序編輯工具中,則不存在該問題。 - 問題原因 客戶端發起一個請求后,IIS會收到足以解析請求標頭的數據,但不會收到整個請求實體正文,如果發現需要客戶端證書時,將嘗試重新協商連接;但此時客戶端正等待向IIS發送請求中的其余數據。因此,如果讓客戶端能接受重新協商,則必須使用SSL預加載功能預加載請求實體正文,此時則可能引起默認設置值`UploadReadAheadSize`長度太小的問題。 - 解決方案
第一步: 進入 `cd C:\Windows\System32\Inetsrv` 目錄執行命令行
appcmd.exe list config -section:system.webServer/serverRuntime // 查看當前設置的 UploadReadAheadSize 大小(byte)
appcmd.exe set config -section:system.webServer/serverruntime /uploadreadaheadsize:20480000 // 這個要設置夠大
第二步
還需要在web.config文件中更改上傳文件的大小
在創建的項目里面是沒有 “web.config” 文件的。
上傳大文件時需要配置下文件的大小,需要在 “config” 文件里配置。創建一個或復制一個 “web.config”
1
2
3
4
5
6
7
8
9
10
11
12
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<configuration>
<system.webServer>
<security>
<requestFiltering>
<!--單位:字節。 -->
<requestLimits maxAllowedContentLength=
"1073741824"
/>
<!-- 1 GB -->
</requestFiltering>
</security>
</system.webServer>
</configuration>
|