Asp.net azure云环境中的图像管理

Asp.net azure云环境中的图像管理,asp.net,azure,azure-storage-blobs,Asp.net,Azure,Azure Storage Blobs,因此,我有一个asp.NETWebForms应用程序,它在每个页面中都有许多图像要显示。上载时,这些图像将存储到数据库中。在移动到云计算之前,我经常检查文件系统是否存在图像,如果是,我获取图像并显示它,否则我会在文件系统中创建图像,然后使用它。现在我想将这个应用程序移动到云上,并实现类似的逻辑,唯一的区别是我保存到azure blob存储帐户并从那里获取图像,而不是文件系统。下面给出的代码用于从blob存储器上载和获取图像 CloudBlobContainer BlobCon

因此,我有一个asp.NETWebForms应用程序,它在每个页面中都有许多图像要显示。上载时,这些图像将存储到数据库中。在移动到云计算之前,我经常检查文件系统是否存在图像,如果是,我获取图像并显示它,否则我会在文件系统中创建图像,然后使用它。现在我想将这个应用程序移动到云上,并实现类似的逻辑,唯一的区别是我保存到azure blob存储帐户并从那里获取图像,而不是文件系统。下面给出的代码用于从blob存储器上载和获取图像

          CloudBlobContainer BlobContainer = Img.GetCloudBlobContainer();
                CloudBlockBlob blob = BlobContainer.GetBlockBlobReference(picture_id + "_HighRes.Jpeg");
                var blobs = BlobContainer.ListBlobs(picture_id + "_HighRes.Jpeg");
                if (blobs.Count()>0)
                {

                    foreach (var i in blobs)
                    {
                        Picture_name = i.Uri.ToString();
                    }
                }
                else
                {
                    SqlConnection Db_Con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_connection"].ToString());
                    DataSet ds_pic = new DataSet();
                    Db_Con.Open();
                    SqlDataAdapter sd_pic = new SqlDataAdapter("select PictureBinary FROM Picture where Id=" + pic_id, Db_Con);
                    sd_pic.Fill(ds_pic);
                    Db_Con.Close();
                    byte[] picbin = (byte[])ds_pic.Tables[0].Rows[0][0];
                    ImageConverter ic = new ImageConverter();
                    System.Drawing.Image img = (System.Drawing.Image)ic.ConvertFrom(picbin);
                    //img.Save(HttpContext.Current.Server.MapPath(imagePath + picture_id + ".Jpeg"), System.Drawing.Imaging.ImageFormat.Jpeg);
                    System.Drawing.Image img4 = null;
                  // VariousQuality(img, picture_id, 200, "_HighRes.Jpeg");
                   // Picture_name = imagePath + picture_id + "_HighRes.Jpeg";
                   BlobContainer = Img.GetCloudBlobContainer();
                    blob = BlobContainer.GetBlockBlobReference(picture_id + "_HighRes.Jpeg");
                    blob.UploadFromStream(new MemoryStream(picbin));
                  blobs = BlobContainer.ListBlobs(picture_id + "_HighRes.Jpeg");
                    foreach (var i in blobs)
                    {
                        Picture_name = i.Uri.ToString();
                    }
                  return Picture_name;

现在这是可行的,但正如你所想象的,这个网站相当慢。有没有更好的方法来处理云中的图像

对于图像,最好的选择是使用Azure CDN,尽管它将使用相同的存储和blob容器,但它的扩展性很好,因为图像现在来自blob的静态url,现在会有一个图像的并行连接,所以我很确定fetch看起来会非常快,因为它与其他内容并行,基本上所有静态内容,如图像、JavaScript、css,如果可以保存在不同的域中,浏览器可以在每个域中进行多个并行连接,因此,页面加载速度更快

将Azure CDN用于图像-


调整网页提示-

有许多可能的方法

我会列出我的一些建议

  • 为web优化jpeg图像,像这样的服务可以显著改善图像大小
  • 确保您的存储帐户位于与客户端连接相同或最接近的区域
  • 尽可能多地使用缓存,一个超提升可能是对最近上传的图像或最需要的图像使用Redis缓存。您需要尝试最适合您的应用程序的方法
  • 另一个缓存策略可以是使用azure CDN
  • 访问数据库时使用参数化查询以防止SQL注入 (感谢丹尼尔·曼)
  • 额外信息 正如我在代码中看到的那样,您将图像直接下载到后端,这意味着任何试图获取图像的浏览器/客户端都会造成开销,因为实际上您下载了两次图像

  • 将图像从存储器下载到web应用服务器端
  • 从服务器端下载到浏览器
  • 网站中的图像通常是公共图像,因此您可以直接将图像下载到浏览器,而无需通过后端。您只需将blob/容器访问设置为public

    如果您的映像不是公共映像并且需要身份验证,则需要创建指向每个映像文件的SAS链接,通过专门为此会话创建的链接访问当前客户端,该链接可能会在一段时间后过期-


    5.访问数据库时使用参数化查询以防止SQL注入