Я недавно работал над генератором динамических изображений aspx в C#, который в своем самом базовом состоянии принимает значение querystring из «t» и записывает эту строку в изображение, а затем возвращает JPG.C# Image Generator - медленная производительность
Он работал безупречно локально, а на тестовом сервере - изображения возвращались мгновенно.
Но когда на балансированных нагрузкой живых серверах иногда работает нормально. Но чаще, чем часто, время истекает/занимает минуту, чтобы вернуть изображение.
Я думал, что спрошу здесь, если в моем коде есть что-то очевидное, что вызовет проблемы, прежде чем я перейду к операторам сервера, чтобы спросить, почему это не работает.
Ниже очень обтекаемый вариант генератора (который также имеет те же проблемы тайм-аута)
protected void Page_Load(object sender, EventArgs e)
{
// Set global stage dimensions
const int stageWidth = 500;
const int stageHeight = 200;
// Create Bitmap placeholder for new image
Bitmap createdImage = new Bitmap(stageWidth, stageHeight);
// Draw new blank image
Graphics imageCanvas = Graphics.FromImage(createdImage);
// Add text
if (!string.IsNullOrEmpty(Request.QueryString["t"]))
{
string imageText = Uri.UnescapeDataString(Request.QueryString["t"]).Trim();
Font font = new Font("Arial", 22);
imageCanvas.DrawString(imageText, font, Brushes.White, 0, 0);
}
// Save
MemoryStream memStream = new MemoryStream();
createdImage.Save(memStream, ImageFormat.Jpeg);
imageCanvas.Dispose();
createdImage.Dispose();
// Set filename/image format
Response.AppendHeader("content-disposition", "filename=MyImage");
Response.ContentType = "image/jpeg";
// Send output to client
memStream.WriteTo(Response.OutputStream);
memStream.Dispose();
Response.Flush();
}
Это тайм-аут на серверах * из-за большой нагрузки *? Свет сервера загружается? Вы подчеркивали это на своем локальном сервере? –
Кроме того, заверните все, что реализует 'IDisposable' в блоке' using'. Если исключение вызывается по какой-либо причине, прежде чем вы вызываете '.Dispose()', вы будете утечка ресурсов ... что было бы плохо при загрузке. –
Он не объясняет тайм-ауты, но я использовал бы простой HttpHandler для этого вместо использования экземпляра страницы, и, если вы не делаете что-то необычное, вам, вероятно, не нужен вызов UnescapeDataString. – bmm6o