3

現在、イメージを含むすべてのデータを SQL Azure に格納しているライトスイッチ アプリケーションがあります。しかし、画像を A​​zure Blob Storage に個別に保管し、すべての非バイナリ データをそのまま保持したいと考えています。

したがって、lightswitch アプリでエンティティを保存した結果は次のようになります。SQL Azure へのデータの挿入/更新と、BLOB ストレージへの画像の挿入/更新です。

この問題に関する最善のアプローチに関する提案は大歓迎です:)。

4

1 に答える 1

0

LightSwitch アプリケーションのサーバー側に短いコードを追加して、関連するデータ エントリの追加および更新時に画像を A​​zure Blob に保存します。

namespace LightSwitchApplication
{
    public partial class ApplicationDataService
    {
        string storageAccount = [aZURE_STORAGE_NAME_HERE]
        string containerName = [CONTAINTER_NAME_HERE]
        string policyName = [POLICY_NAME_HERE]
        string policySig = [OBTAINED_POLICY_SIG_HERE]

        partial void SaveChanges_Executing()
        {
            if (this.DataWorkspace.ApplicationData.Details.HasChanges)
            {
                EntityChangeSet changeSet = this.DataWorkspace.ApplicationData.Details.GetChanges();
                foreach (IEntityObject entity in changeSet.ModifiedEntities)
                {
                    string type = entity.GetType().Name;
                    // ... 
                    // My type of LightSwitch entities are for example "Places"

                    UploadFileToBlob((Place)entity, containerName, policyName, policySig);
                }
            }
        }

        private void UploadFileToBlob(Place p, String container, String policyName, String policySig)
        {
            string signature = "?sr=c&si=" + policyName + "&sig=" + policySig;
            string file = p.Id + ".png";
            WebResponse resp = UploadFile(storageAccount, container, file, signature, p.Photo);
        }

        static WebResponse UploadFile(string storageAccount, string container, string filename, string signature, byte[] data)
        {
            try
            {
                var req = (HttpWebRequest)WebRequest.Create(string.Format("http://{0}.blob.core.windows.net/{1}/{2}{3}", storageAccount, container, filename, signature));
                req.Method = "PUT";
                req.ContentType = "image/png";
                req.ContentLength = data.Length;
                req.Date = DateTime.UtcNow;
                //req.Headers.Add("x-ms-date", DateTime.UtcNow.ToString());
                req.Headers.Add("x-ms-version", "2012-02-12");
                req.Headers.Add("x-ms-blob-type", "BlockBlob");

                using (Stream stream = req.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }

                var a = req.Headers.ToString();

                return req.GetResponse();
            }
            catch (Exception e)
            { 
                // ...
            }
        }
    }
}

対応するエンティティが変更されるたびに、ファイルを BLOB に送信します。角括弧内の値は、Azure アカウントに応じて変更する必要があります。

ポリシーの署名を取得する方法は、公式ドキュメントのPart 1 & Part 2で詳しく説明されている Shared Access Signatureです。

于 2014-03-05T20:25:44.753 に答える