5

私は最近、C# で aspx 動的画像ジェネレーターに取り組んでいます。これは、最も基本的には、"t" からクエリ文字列値を取得し、その文字列を画像に書き込み、JPG を返します。

ローカルでもテスト サーバーでも問題なく動作し、画像はすぐに返されました。

ただし、負荷分散されたライブ サーバーでは、正常に動作する場合があります。しかし、多くの場合、タイムアウトするか、画像を返すのに最大 1 分かかります。

サーバー オペレーターに問題の原因を尋ねる前に、自分のコードに問題を引き起こしている明らかな点があるかどうかをここで尋ねようと思いました。

以下は、ジェネレーターの非常に合理化されたバージョンです (まったく同じタイムアウトの問題もあります)。

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();
}
4

2 に答える 2

3

私が変更するいくつかのことがあります:

  • キーワードを使用してストリームを囲みますusing
  • 代わりに ashx ハンドラーを使用してください。aspx ファイルを使用しているようです。この種のシナリオでは、ライフサイクルが短いため、http ハンドラーを使用することをお勧めします。画像のサムネイルを提供するためにこれを何度も使用しました。
  • いくつかのキャッシュを使用します。おそらく、asp.net キャッシュ機能を利用できます。t の値が繰り返されているかどうかを確認できるため、結果の画像をキャッシュに保存し、毎回いくつかのストリームの書き込みと作成を回避できます。
  • 最後になりましたが、サーバーに最新の SP と更新プログラムがあるかどうかを確認してください。特定の更新プログラムが不足していると、アプリの動作がおかしくなる場合がありますが、

また、Web ファーム自体に関連付けることもできます。サーバーのパフォーマンス カウンターを確認して、何らかの異常が報告されているかどうかを確認できます。

それが役に立てば幸い。

于 2012-08-06T19:17:36.373 に答える
1

メモリストリームを使用する代わりに、出力ストリームに直接保存することで、メモリを節約し、パフォーマンスを向上させることができます。

createdImage.Save(Response.OutputStream, ImageFormat.Jpeg); 

もう1つの問題は、コードが.aspxページにあることである可能性があります。再コンパイルが多すぎる可能性があります。http-handlerをお勧めします:

public class MyHttpHandler : IHttpHandler
{
   public void ProcessRequest(HttpContext context)
   {
      // prepare image like you did
      memStream.WriteTo(context.Response.OutputStream);
   }

   // Override the IsReusable property.
   public bool IsReusable
   {
      get { return true; }
   }
}
于 2012-08-06T19:59:59.083 に答える