问题我是否考虑过一些.net
,ASP
,MVC
甚至IIS
优化?或者这整个方法只是一个坏主意?
SCENARIO
以下适用于0K
我有一个ImageController
,允许我动态优化和缓存图像。
实际通话如下:/image/user/1?width=200&height=200
控制器本身就是这样:
[AllowAnonymous] // TODO author/revise
public class ImageController : FileController
{
private FileResult Image(string entity, long id, int? width, int? height, Position? position=null)
{
string file = base.ImageHandler.ImagesPaths(Paths.img, entity, id.ToString()).FirstOrDefault();
if (string.IsNullOrEmpty(file))
{
throw new HttpException(404, "File not found");
}
// implicit else
string extension = Path.GetExtension(file);
System.Drawing.Imaging.ImageFormat oImageFormat = WebFileSystemImageHandler.ImageFormat(extension);
if ((null != width) || (null != height))
{
// vvv Beginning of IS THERE SOMETHING WRONG WITH THIS? vvv
string path = string.Format("{0}{1}/{2}/", Paths.img, entity, id);
string pathServer = Server.MapPath(path);
if (!Directory.Exists(pathServer))
Directory.CreateDirectory(pathServer);
string pattern = "";
if (null != width ) pattern += width.ToString(); // 500
if (null != height) pattern += "x" + height.ToString(); // 500x400, or x400 w/o width
string cache = Directory.GetFiles(pathServer, pattern).FirstOrDefault();
// ^^^ End of IS THERE SOMETHING WRONG WITH THE ABOVE ^^^
if (string.IsNullOrEmpty(cache))
{// no cache? sure let's get you started!
Image oImage = System.Drawing.Image.FromStream( new MemoryStream( System.IO.File.ReadAllBytes(file) ) );
file = Server.MapPath(path + pattern + extension);
Bitmap oBitmap = new Bitmap(oImage);
oBitmap = oBitmap.Adjust(width:width, height:height, position:position);
oBitmap = oBitmap.Compress();
oBitmap.Save(file, oImageFormat);
}
else
file = cache;
}
MemoryStream oStream = new MemoryStream( System.IO.File.ReadAllBytes(file) );
string mime = string.Format("image/{0}", extension.Replace(".", ""));
return new FileContentResult(oStream.ToArray(), mime);
}
base.ImageHandler.ImagesPaths
基本上返回Directory.GetFiles("{folder}\{entity}\", "{id}.*").FirstOrDefault()
问题当我有一个包含多个这些图片的图库页面时,html
立即渲染但图像显示为空并开始逐个弹出(我想这是因为每个会话1次调用控制器)。我希望这可以作为预期行为仅限第一次运行,但每次都会发生
答案 0 :(得分:1)
我不建议您在MVC中使用GDI进行图像大小调整,因为它不受支持并且如果不小心使用会导致内存泄漏和其他问题(请参阅http://weblogs.asp.net/bleroy/archive/2009/12/10/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi.aspx)。
您应该查看使用Windows Imaging Components等替代方案,或者为了简单起见而使用Imageresizer(http://imageresizing.net/)
另见bertrand的后续帖子:http://weblogs.asp.net/bleroy/archive/2010/05/03/the-fastest-way-to-resize-images-from-asp-net-and-it-s-more-supported-ish.aspx 和http://weblogs.asp.net/bleroy/archive/2011/10/22/state-of-net-image-resizing-how-does-imageresizer-do.aspx就实现基于网络的快速调整大小的各种方法提供建议
答案 1 :(得分:1)
作为旁注:
如果您的应用使用HttpSession
,请确保使用以下Controller
或至少只读禁用该应用,使用:
[SessionState(SessionStateBehavior.ReadOnly)]
这样至少可以并行执行2个请求。
此外,如果图像和大小的数量有限且不会太大,您可以通过在客户端和服务器设置(内存中)使用OutputCache
来简化所有这些操作。您可以避免将图像写入物理存储,并且可以在用户之间重复使用已调整大小的输出。