在ASP.NET中拦截文件请求并返回动态创建的内容

时间:2013-10-28 17:39:34

标签: c# asp.net asp.net-mvc iis

我正在使用一个只能绘制简单图形对象或将url带到图像文件的javascript框架。我需要更复杂的图形,但有太多的组合来创建所有不同的可能图像。是否可以在服务器上拦截文件请求并在其位置返回动态创建的内容(png图像)?

1 个答案:

答案 0 :(得分:2)

当然,您可以让控制器操作返回图像文件。这是我写的一个例子,用于将文本写入图像并将其返回。

请注意,您可能希望使用OutputCache并使用VaryByParam,以便输出缓存知道应该考虑哪些查询字符串参数来决定请求是针对已生成的图像还是不

[OutputCache(Duration=86400, VaryByParam="text;maxWidth;maxHeight")]
public ActionResult RotatedImage(string text, int? maxWidth, int? maxHeight)
{
    SizeF textSize = text.MeasureString(textFont);

    int width = (maxWidth.HasValue ? Math.Min(maxWidth.Value, (int)textSize.Width) : (int)textSize.Width);
    int height = (maxHeight.HasValue ? Math.Min(maxHeight.Value, (int)textSize.Height) : (int)textSize.Height);

    using (Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb))
    {
        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.TextRenderingHint = TextRenderingHint.AntiAlias;
            g.DrawString(text, textFont, Brushes.Black, zeroPoint, StringFormat.GenericTypographic);

            bmp.RotateFlip(RotateFlipType.Rotate270FlipNone);

            using (MemoryStream ms = new MemoryStream())
            {
                bmp.Save(ms, ImageFormat.Png);
                return File(ms.ToArray(), "image/png");
            }
        }
    }
}