@@ -15,20 +15,36 @@ public abstract class BaseStorage<T, TOptions> : IStorage<T, TOptions> where TOp
1515{
1616 protected bool IsContainerCreated ;
1717 protected TOptions StorageOptions ;
18+ private readonly SemaphoreSlim _semaphoreSlim = new ( 1 , 1 ) ;
1819
1920 protected BaseStorage ( TOptions storageOptions )
2021 {
2122 Contract . Assert ( storageOptions is not null ) ;
2223 StorageOptions = storageOptions ! ;
24+ // ReSharper disable once VirtualMemberCallInConstructor
2325 StorageClient = CreateStorageClient ( ) ;
2426 }
2527
2628 public async Task < Result > CreateContainerAsync ( CancellationToken cancellationToken = default )
2729 {
28- var result = await CreateContainerInternalAsync ( cancellationToken ) ;
29- cancellationToken . ThrowIfCancellationRequested ( ) ;
30- IsContainerCreated = result . IsSuccess ;
31- return result ;
30+ try
31+ {
32+ await _semaphoreSlim . WaitAsync ( cancellationToken ) ;
33+ cancellationToken . ThrowIfCancellationRequested ( ) ;
34+
35+ var result = await CreateContainerInternalAsync ( cancellationToken ) ;
36+ cancellationToken . ThrowIfCancellationRequested ( ) ;
37+ IsContainerCreated = result . IsSuccess ;
38+ return result ;
39+ }
40+ catch ( Exception ex )
41+ {
42+ return Result . Fail ( ex ) ;
43+ }
44+ finally
45+ {
46+ _semaphoreSlim . Release ( ) ;
47+ }
3248 }
3349
3450 public abstract Task < Result > RemoveContainerAsync ( CancellationToken cancellationToken = default ) ;
@@ -89,15 +105,15 @@ public Task<Result<BlobMetadata>> UploadAsync(FileInfo fileInfo, Action<UploadOp
89105 public Task < Result < BlobMetadata > > UploadAsync ( Stream stream , UploadOptions options , CancellationToken cancellationToken = default )
90106 {
91107 if ( string . IsNullOrWhiteSpace ( options . MimeType ) )
92- options . MimeType = MimeHelper . BIN ;
108+ options . MimeType = MimeHelper . GetMimeType ( options . FileName ) ;
93109
94110 return UploadInternalAsync ( stream , SetUploadOptions ( options ) , cancellationToken ) ;
95111 }
96112
97113 public Task < Result < BlobMetadata > > UploadAsync ( byte [ ] data , UploadOptions options , CancellationToken cancellationToken = default )
98114 {
99115 if ( string . IsNullOrWhiteSpace ( options . MimeType ) )
100- options . MimeType = MimeHelper . BIN ;
116+ options . MimeType = MimeHelper . GetMimeType ( options . FileName ) ;
101117
102118 return UploadInternalAsync ( new MemoryStream ( data ) , SetUploadOptions ( options ) , cancellationToken ) ;
103119 }
@@ -269,13 +285,16 @@ public Task<Result> SetStorageOptions(Action<TOptions> options, CancellationToke
269285
270286 protected abstract T CreateStorageClient ( ) ;
271287
272- protected Task < Result > EnsureContainerExist ( )
288+ protected Task < Result > EnsureContainerExist ( CancellationToken cancellationToken = default )
273289 {
290+ if ( StorageClient is null )
291+ throw new InvalidOperationException ( "Storage client is not initialized." ) ;
292+
274293 if ( IsContainerCreated )
275294 return Result . Succeed ( )
276295 . AsTask ( ) ;
277296
278- return CreateContainerAsync ( ) ;
297+ return CreateContainerAsync ( cancellationToken ) ;
279298 }
280299
281300 protected UploadOptions SetUploadOptions ( UploadOptions options )
0 commit comments