ブロブストレージのAPI参照

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

Sitecore Azure Blob Storageモジュールは以下のアセンブリで構成されています:

  • Sitecore.Framework.Data.Blobs - AzureStorageBlobProvider クラスを提供し、APIがブロブストレージと連携できるようにします。

Sitecoreは基盤となるブロブ提供者(例

)を含むBlobStorage APIを公開し、ブロブストレージと連携するための便利なAPIを提供します。デフォルトでは、BlobStorage APIは以下のアセンブリで構成されています。

  • Sitecore.Framework.Data.Blobs.Abstractions - Sitecore Blob Storage モジュール向けの blob プロバイダーを実装するための抽象化を提供します。
  • Sitecore.Framework.Data.Blobs - Sitecoreで設定されたブロブプロバイダーを知らずに、Blobストレージを扱える便利なAPIを提供します。

BlobStorage API

Sitecoreのデータベースは、1つ以上のストレージをBlobストレージに使用できます。Sitecoreでは、Database.BlobStorageプロパティにはSitecoreデータベースと連携するBlobプロバイダーのリストが含まれています。また、Blobストレージの拡張機能として機能するためのAPIも記載されており、Sitecoreで設定されたBlobプロバイダーについて知らなくても利用できます。

SitecoreのBlobStorageにアクセスするには以下のコードを使用します。

BlobStorage blobStorage = Database.BlobStorage;

以下のクラス名例は、BlobStorage拡張のSitecore APIの使い方を示しています。

  • **方法:**BlobExists
  • 説明
    IDで使用し、Blobストレージアカウントにblobが存在するかどうかを確認します。
  • 例:

try { var blobId = blobStorage.CreateBlobIdentifier(new Guid("B4D19D07-B3EB-4F7D-98EC-8BCB41CCC58E")); var isBlobExists = blobStorage.BlobExists(blobId); } catch (BlobProviderException ex) { // Handle exception }

  • **方法:**GetBlob
  • 説明
    IDで使い、Blob Storageから特定のブロブを取得します。
  • 例:

try { var blobId = blobStorage.CreateBlobIdentifier(new Guid("B4D19D07-B3EB-4F7D-98EC-8BCB41CCC58E")); var blobStream = blobStorage.GetBlob(blobId); } catch (BlobProviderException ex) { // Handle exception }

  • **方法:**RemoveBlob
  • 説明
    IDで使用し、Blob StorageからBlobを削除してください。
  • 例:

try { var blobId = blobStorage.CreateBlobIdentifier(new Guid("B4D19D07-B3EB-4F7D-98EC-8BCB41CCC58E")); blobStorage.RemoveBlob(blobId); } catch (BlobProviderException ex) { // Handle exception }

  • **方法:**SetBlob
  • 説明
    IDで使用し、BlobをBlob Storageに保存します。
  • 例:

try { var blobId = blobStorage.CreateBlobIdentifier(); using (var blobStream = new MemoryStream(Encoding.UTF8.GetBytes("SampleStream"))) { blobStorage.SetBlob(blobStream, blobId); } } catch (BlobProviderException ex) { // Handle exception }

孤児の塊を除去する

Sitecoreのブロブストレージ・ガベージコレクション機能は、Sitecoreから孤立したブロブを削除するのに役立ちます。削除を開始するには以下の方法があります: Sitecore.Data.DefaultDatabase.BlobStorage.CleanupOrphanBlobs。

例えば:

var database = Sitecore.Configuration.Factory.GetDatabase("master"); database.BlobStorage.CleanupOrphanBlobs();

AzureStorageBlobProvider APIs

必要に応じて、ブロブプロバイダーに直接アクセスする方法がいくつかあります:

  • 例1:

    IBlobProviderAsync blobProvider = blobStorage.GetBlobProvider();

  • 例2:

    IBlobProviderAsync blobProvider = blobStorage.GetDefaultBlobProvider();

  • 例3:

    BlobIdentifier blobId = new BlobIdentifier("B4D19D07-B3EB-4F7D-98EC-8BCB41CCC58E"); IBlobProviderAsync blobProvider = blobStorage.GetBlobProvider(blobId);

以下のクラス名例は、BlobProviderメソッドのSitecore APIの使い方を示しています。

  • **方法:**BlobExists
  • 説明
    IDで使用し、BlobがBlob Storageに存在しているか確認します。
  • 例:

try { var blobId = blobProvider.CreateBlobIdentifier(new Guid("B4D19D07-B3EB-4F7D-98EC-8BCB41CCC58E")); var isBlobExists = blobProvider.BlobExists(blobId); } catch (BlobProviderException ex) { // Handle exception }

  • **方法:**GetBlob
  • 説明
    IDで使い、Blob Storageから特定のブロブを取得します。
  • 例:

try { var blobId = blobProvider.CreateBlobIdentifier(new Guid("B4D19D07-B3EB-4F7D-98EC-8BCB41CCC58E")); var blobStream = blobProvider.GetBlob(blobId); } catch (BlobProviderException ex) { // Handle exception }

  • **方法:**RemoveBlob
  • 説明
    IDで使用し、Blobストレージからブロブを削除します。
  • 例:

try             {                blobProvider.RemoveBlob(blobId);             }            catch (BlobProviderException ex)             {                 // Handle exception             }

  • **方法:**SetBlob
  • 説明
    IDで使用し、Blob StorageにBlobを保存します。
  • 例:

try { var blobId = blobProvider.CreateBlobIdentifier(); using (var blobStream = new MemoryStream(Encoding.UTF8.GetBytes("SampleStream"))) { blobProvider.SetBlob(blobStream, blobId); } } catch (BlobProviderException ex) { // Handle exception }

Extend AzureStorageBlobProvider APIs

例えば、GetBlob APIを拡張したい場合は、ブロブプロバイダーメソッドを拡張できます。

using Sitecore.Framework.Data.Blobs.Abstractions; using Sitecore.Framework.Data.Blobs.Azure; using System.IO;

namespace Documentation { public class ExtendGetBlob : AzureStorageBlobProvider { public ExtendGetBlob(string connectionStringName, IPagedListProvider usedBlobIdsPagedListProvider) : base(connectionStringName, usedBlobIdsPagedListProvider) { }

public override Stream GetBlob(BlobIdentifier identifier) { var blobStream = base.GetBlob(identifier);

// Code to extend the GetBlob default behavior

return blobStream; } } }

新しいBlobProviderを作成する

例えば、Sitecore.Framework.Data.Blobs.Abstractions APIを使って自分でブロブプロバイダーを作成できます。例えば、InMemoryBlobProvider APIを作成したい場合は:

using Sitecore.Framework.Conditions; using Sitecore.Framework.Data.Blobs.Abstractions; using System; using System.Collections.Generic; using System.IO;

namespace Documentation { public class InMemoryBlobProvider : IBlobProvider { private readonly string _scheme = "memoryblob"; private IDictionary<Uri, byte> blobs = new Dictionary<Uri, byte>();

private void ValidateIdentifier(BlobIdentifier identifier) { if (!CanHandle(identifier)) throw new InvalidOperationException( $"The identifier '{identifier}' is not in acceptable format by this provider"); }

private byte GetBytes(Stream input) { using (MemoryStream ms = new MemoryStream()) { input.CopyTo(ms); return ms.ToArray(); } }

public bool BlobExists(BlobIdentifier identifier) { Condition.Requires(identifier, nameof(identifier)).IsNotNull();

if (string.IsNullOrEmpty(identifier.ToString())) { return false; }

ValidateIdentifier(identifier);

try { return blobs.ContainsKey(identifier.ToUri()); } catch (Exception ex) { throw new BlobProviderException(ex.Message, ex.InnerException); } }

public bool CanHandle(BlobIdentifier identifier) { return (identifier != null) && Uri.TryCreate(identifier.ToString(), UriKind.Absolute, out Uri result) && result.Scheme != null && result.Scheme.Equals(_scheme, StringComparison.InvariantCultureIgnoreCase); }

public BlobIdentifier CreateBlobIdentifier() { return new BlobIdentifier($"{_scheme}://{Guid.NewGuid()}"); }

public BlobIdentifier CreateBlobIdentifier(Guid guid) { Condition.Requires(guid, nameof(guid)).IsNotEqualTo(Guid.Empty);

return new BlobIdentifier($"{_scheme}://{guid}"); }

public Guid ToGuid(BlobIdentifier identifier) { Condition.Requires(identifier, nameof(identifier)).IsNotNull(); ValidateIdentifier(identifier);

return new Guid(new Uri(identifier.ToString()).Host); }

public Stream GetBlob(BlobIdentifier identifier) { Condition.Requires(identifier, nameof(identifier)).IsNotNull();

if (string.IsNullOrEmpty(identifier.ToString())) { return null; }

ValidateIdentifier(identifier);

try { if (blobs.ContainsKey(identifier.ToUri())) { return new MemoryStream(blobsidentifier.ToUri()); } else { return null; } } catch (Exception ex) { throw new BlobProviderException(ex.Message, ex.InnerException); } }

public void RemoveBlob(BlobIdentifier identifier) { Condition.Requires(identifier, nameof(identifier)).IsNotNull();

ValidateIdentifier(identifier);

if (blobs.ContainsKey(identifier.ToUri())) { blobs.Remove(identifier.ToUri()); } }

public void SetBlob(Stream stream, BlobIdentifier identifier) { Condition.Requires(stream, nameof(stream)).IsNotNull(); Condition.Requires(identifier, nameof(identifier)).IsNotNull();

ValidateIdentifier(identifier);

blobsidentifier.ToUri() = GetBytes(stream); }

}

public static class BlobIdentifierExtensions { public static bool IsUri(this BlobIdentifier identifier) { if (identifier != null && !string.IsNullOrWhiteSpace(identifier.ToString())) { string blobId = identifier.ToString(); if (Uri.IsWellFormedUriString(blobId, UriKind.Absolute)) { return true; } } return false; }

public static Uri ToUri(this BlobIdentifier identifier) { Condition.Requires(identifier, nameof(identifier)).IsNotNull();

if (!identifier.IsUri()) { throw new ArgumentException($"Provided identifier {identifier.ToString()} is not a valid Uri."); }

return new Uri(identifier.ToString()); } } }

この記事を改善するための提案がある場合は、 お知らせください!