public async Task Invoke(HttpContext context) { var path = context.Request.Path.Value; // 无 host 和 querystring。如:/res/icon/add.png var ext = path.GetFileExtension(); if (!Extensions.Contains(ext)) { await _next.Invoke(context); return; } // 原图路径校验 var rawPath = Asp.MapPath(path); if (!File.Exists(rawPath)) { //Asp.Error(404, "Not found"); // 因为 wwwroot 的原因,MapPath 出来的路径可能不对,就不做处理了 await _next.Invoke(context); return; } // 原图输出 var pathAndQuery = path + context.Request.QueryString; var mimeType = path.GetMimeType(); var w = Asp.GetQueryInt("w"); if (w == null) { Asp.WriteFile(rawPath, mimeType: mimeType); return; } // 缩略图参数 var h = Asp.GetQueryInt("h"); if (w > 1000) { w = 1000; } if (h != null && h > 1000) { h = 1000; } var key = pathAndQuery.ToLower().MD5(); // 缩略图缓存策略 var cachePath = Asp.MapPath(string.Format("/Caches/{0}.cache", key)); if (!File.Exists(cachePath)) { IO.PrepareDirectory(cachePath); var img = Painter.Thumbnail(rawPath, w.Value, h); img.Save(cachePath); img.Dispose(); } Asp.WriteFile(cachePath, mimeType: mimeType); }