0

EF5とMVC3を使用してデータベースから小さな画像をストリーミングする際に問題が発生しました

1枚の画像をストリーミングする場合はうまく機能しますが、ページに5枚の画像が含まれている場合は、接着剤のようになり、それぞれのサイズが5〜200 kbしかない場合でも、読み込みに最大5秒かかります。

ここに画像の説明を入力してください

いくつかの投稿を読んで、これをweb.configに追加しました

<system.net> 
  <connectionManagement> 
    <add address="*" maxconnection="100" /> 
  </connectionManagement> 
</system.net> 

私の問題には何の影響もありませんでした。

そしてこれをストリーミングに使用します:

 public class ImageResult : ActionResult
    {
        public ImageResult(Stream imageStream, string contentType)
        {
            if (imageStream == null)
                throw new ArgumentNullException("imageStream");
            if (contentType == null)
                throw new ArgumentNullException("contentType");

            this.ImageStream = imageStream;
            this.ContentType = contentType;
        }

        public Stream ImageStream { get; private set; }
        public string ContentType { get; private set; }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
                throw new ArgumentNullException("context");

            HttpResponseBase response = context.HttpContext.Response;

            response.ContentType = this.ContentType;

            byte[] buffer = new byte[4096];
            while (true)
            {
                int read = this.ImageStream.Read(buffer, 0, buffer.Length);
                if (read == 0)
                    break;

                response.OutputStream.Write(buffer, 0, read);
            }

            response.End();
        }
    }

アップデート

ImageResultを削除し、return Fileを追加しました......速度は上がりますが、それでも許容できる速度ではありません.....18kbファイルの場合は2秒です。

コントローラ:

   [SessionState(SessionStateBehavior.Disabled)]
   public class ContentController : Controller
    {
    .....
       public ActionResult Thumbnail(int fileID, int width)
       {
           var thumbnail = _fileRep.GetThumbnail(fileID, width);

           return File(thumbnail.FileContent, thumbnail.ContentType);
        }
4

1 に答える 1

2

おそらく、直面している問題は、ASP.NETセッション状態へのアクセスがセッションごとに排他的であるという事実が原因です。これは、同じセッションに対して2つの同時リクエストが(同じSessionID値を使用して)行われた場合、最初のリクエストがセッション情報への排他的アクセスを取得することを意味します。2番目の要求は、最初の要求が終了した後にのみ実行されます。詳細については、ASP.NETセッション状態の概要同時要求とセッション状態のセクション)を参照してください。

画像のアクションメソッドがセッションへのアクセスを必要としない場合は、コントローラーをSessionStateAttribute属性で装飾することで問題を解決できます。

[SessionState(SessionStateBehavior.Disabled)]

これにより、コントローラーは「並列」の方法で要求を処理できるようになります。

セッションへの読み取りアクセスが必要な場合は、SessionStateBehavior.ReadOnly値を使用してみてください。これにより排他ロックが発生することはありませんが、要求は読み取り/書き込み要求によって設定されたロックを待機する必要があります。

于 2013-03-26T08:27:04.517 に答える