Ho lavorato di recente a un generatore di immagini dinamiche aspx in C# che, nella sua forma più semplice, prende un valore di querystring da "t" e scrive quella stringa su un'immagine, quindi restituisce un JPG.C# Image Generator - Slow Performance
Ha funzionato perfettamente a livello locale e su un server di prova - le immagini sono state restituite all'istante.
Ma quando su server live con carico bilanciato, a volte funziona correttamente. Ma più che spesso scade/impiega fino a un minuto per restituire l'immagine.
Ho pensato di chiedere qui se c'è qualcosa di ovvio nel mio codice che potrebbe causare problemi, prima di rivolgersi agli operatori di server per chiedere perché questo non funziona bene.
Qui di seguito è una versione molto semplificata del generatore (che ha anche gli stessi problemi esatti timeout)
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();
}
È il timeout sui server * a causa del carico pesante *? Il server carica la luce? Hai sottolineato questo test sul tuo server locale? –
Inoltre, avvolgere tutto ciò che implementa 'IDisposable' in un blocco' using'. Se un'eccezione viene lanciata per qualsiasi motivo prima di chiamare '.Dispose()' si verificheranno perdite di risorse ... il che sarebbe particolarmente pericoloso sotto carico. –
Non spiega i timeout, ma userei un semplice HttpHandler per questo usando invece un'istanza di Pagina e, a meno che tu stia facendo qualcosa di insolito, probabilmente non hai bisogno della chiamata di UnescapeDataString. – bmm6o