ASP.NET图表自定义处理程序

时间:2012-06-08 10:32:01

标签: c# asp.net azure azure-storage asp.net-charts

在我的网络应用程序是"内部部署"之前我使用的解决方案"标准"具有磁盘存储模式的asp.net图表控件。像这样:

<asp:Chart ID="AssetDistChart" runat="server" BackColor="Transparent" 
    Width="250px" Height="350px" ImageStorageMode="UseImageLocation" ImageLocation="~/files/categories_#SEQ(30,20)"> ...

有了这个,我的所有图表的图片都是在文件夹/文件中使用名称categories_XXX生成的......这样就完美了。

现在,我需要将我的解决方案转移到Azure平台,并且将图表图像存储在磁盘上不再是我的选择。所以我创建了自己的图表处理程序,用于保存/加载Blob存储中的图表图像。处理程序如下:

public class ChartImageHandler : IChartStorageHandler
    {
        ...

        public void Delete(string key)
        {
            CloudBlob csv = chartContainer.GetBlobReference(key);
            csv.Delete();
        }

        public bool Exists(string key)
        {
            bool exists = true;
            WebClient webClient = new WebClient();
            try
            {
                using (Stream stream = webClient.OpenRead(key))
                { }
            }
            catch (WebException)
            {
                exists = false;
            }
            return exists;
        }

        public byte[] Load(string key)
        {
            CloudBlob image = chartContainer.GetBlobReference(key);
            byte[] imageArray;
            try
            {
                imageArray = image.DownloadByteArray();
            }
            catch (Exception e)
            {
                System.Threading.Thread.Sleep(1000);
                imageArray = image.DownloadByteArray();

            }
            return imageArray;
        }

        public void Save(string key, byte[] data)
        {
            CloudBlockBlob pictureBlob = chartContainer.GetBlockBlobReference(key);
            pictureBlob.UploadByteArray(data);
        }
    }

另外,我的asp.net图表控件现在是这样的:

<asp:Chart ID="AssetDistChart" runat="server" BackColor="Transparent" 
    Width="250px" Height="350px" ImageStorageMode="UseHttpHandler">

我还在web.config中编辑了图表设置以使用这个新的处理程序。

此处理程序有效,但我的图片以通用名称保存:

chart_0.png chart_1.png ...

如何像以前一样管理我自己的文件名。我尝试添加ImageLocation="~/files/categories_#SEQ(30,20)"

到asp.net图表控件但没有成功。如何设置自己的名称(键)以及放置位置?在处理程序,asp.net图表控件或声明char控件的代码隐藏文件中。

1 个答案:

答案 0 :(得分:1)

在上面的代码中,当您将图像存储在Azure Blob存储中时,您将其直接存储在容器中,以便在访问它们时将其检索为

http://azure_storage_name.*/_containername_/chartimage_name

或者,您可以创建文件夹类型图表图像名称,例如files / categories_1和files / categories_2等,它们将存储在Azure Blob存储中:

http://azure_storage_name.*/_containername_/files/categories_1
http://azure_storage_name.*/_containername_/files/categories_2

要获得它,您只需在将其保存在Save()函数中时更改代码:

string key = "files/myimage_1.jpg";
CloudBlockBlob pictureBlob = container.GetBlockBlobReference(key);

因此,当您保存图像时,它将保存为您的azure storage /container_name/files/myimage_1.jpg,您可以通过访问Windows Azure存储进行验证。

现在,当您阅读它时,只需读取密钥,您就会得到预期的文件名。您可能需要按摩您的代码以获得您想要的方式,但我已经告诉您如何做到这一点。