From 3cc97ce6b0190c3295dc20f4de2c94247cd29200 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Tue, 28 Nov 2017 00:14:34 -0700 Subject: [PATCH 01/18] Enter commit message (#29) --- .../AzureStorageEmulatorFixture.cs | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs index f097dbe..38233b8 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs @@ -1,5 +1,10 @@ namespace ServiceBus.AttachmentPlugin.Tests { + using System; + using System.Diagnostics; + using System.Linq; + using System.Net; + using System.Net.NetworkInformation; using System.Threading; public class AzureStorageEmulatorFixture @@ -7,9 +12,27 @@ public class AzureStorageEmulatorFixture public AzureStorageEmulatorFixture() { AzureStorageEmulatorManager.StartStorageEmulator(); + // Emulator is not started fast enough on AppVeyor // Microsoft.WindowsAzure.Storage.StorageException : Unable to connect to the remote server - Thread.Sleep(1000); + + var properties = IPGlobalProperties.GetIPGlobalProperties(); + bool emulatorStarted; + + var stopwatch = Stopwatch.StartNew(); + + do + { + var endpoints = properties.GetActiveTcpListeners(); + emulatorStarted = endpoints.Any(x => x.Port == 10000 && Equals(x.Address, IPAddress.Loopback)); + Console.WriteLine("waiting for emulator to start..."); + Thread.Sleep(100); + } while (emulatorStarted == false && stopwatch.Elapsed < TimeSpan.FromSeconds(60)); + + if (emulatorStarted == false) + { + throw new Exception("Storage emulator failed to start after 10 seconds."); + } } } } \ No newline at end of file From 1a03e00315a0ebc93d090db98b673e62cfbc7b08 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Wed, 31 Jan 2018 22:51:03 -0700 Subject: [PATCH 02/18] Add files via upload --- images/using/RISC.software.png | Bin 0 -> 2876 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/using/RISC.software.png diff --git a/images/using/RISC.software.png b/images/using/RISC.software.png new file mode 100644 index 0000000000000000000000000000000000000000..12c1ce7a24bded71158086cab431f02dfc4230e9 GIT binary patch literal 2876 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 Date: Wed, 31 Jan 2018 22:54:00 -0700 Subject: [PATCH 03/18] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 250494b..1efee89 100644 --- a/README.md +++ b/README.md @@ -117,9 +117,10 @@ new AzureStorageAttachmentConfiguration(storageConnectionString, message => mess ## Who's trusting this add-in in production ![Codit](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/images/using/Codit.png) +![RISC Software](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/develop/images/using/RISC.software.png) Proudly list your company here if use this add-in in production ## Icon -Created by Dinosoft Labs from the Noun Project. \ No newline at end of file +Created by Dinosoft Labs from the Noun Project. From 32c12405357725e0d4ddf30009faf7b306083b47 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Tue, 6 Mar 2018 13:47:09 -0700 Subject: [PATCH 04/18] Fix failing R# code analysis --- .../When_receiving_message.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs b/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs index 012c51b..446df1e 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs @@ -28,8 +28,8 @@ public async Task Should_throw_exception_with_blob_path_for_found_that_cant_be_f connectionString: "UseDevelopmentStorage=true", containerName: "attachments-wrong-containers")); var exception = await Assert.ThrowsAsync(() => receivingPlugin.AfterMessageReceive(message)); - Assert.Contains("attachments-wrong-containers", exception.Message); - Assert.Contains(message.UserProperties["$attachment.blob"].ToString(), exception.Message); + Assert.Contains("attachments-wrong-containers", actualString: exception.Message); + Assert.Contains(message.UserProperties["$attachment.blob"].ToString(), actualString: exception.Message); } } } From b0025bbbe6bf5d098922edfff1c10e3c9150ef5f Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Thu, 8 Mar 2018 15:39:56 -0700 Subject: [PATCH 05/18] Add abstraction for connection string --- .../IProvideStorageConnectionString.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs diff --git a/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs b/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs new file mode 100644 index 0000000..8499f67 --- /dev/null +++ b/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs @@ -0,0 +1,13 @@ +namespace ServiceBus.AttachmentPlugin +{ + /// + /// Storage account connection string provider. + /// + public interface IProvideStorageConnectionString + { + /// + /// Connection string for storage account to be used. + /// + string GetConnectionString(); + } +} \ No newline at end of file From 7086cd1351fe63b304da621b5c6488f62422952e Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Thu, 8 Mar 2018 15:41:19 -0700 Subject: [PATCH 06/18] Add plain text connection string provider --- .../PlainTextConnectionStringProvider.cs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs diff --git a/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs b/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs new file mode 100644 index 0000000..18473e8 --- /dev/null +++ b/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs @@ -0,0 +1,25 @@ +namespace ServiceBus.AttachmentPlugin +{ + /// + /// Static connection string provider. + /// + public class PlainTextConnectionStringProvider : IProvideStorageConnectionString + { + readonly string connectionString; + + /// + /// Storage connection string to use in plain text. + public PlainTextConnectionStringProvider(string connectionString) + { + this.connectionString = connectionString; + } + + /// + /// Return connection string for Storage account. + /// + public string GetConnectionString() + { + return connectionString; + } + } +} \ No newline at end of file From 01584eae5d70bae047bad573ba6435ec9f913b1e Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Thu, 8 Mar 2018 15:44:09 -0700 Subject: [PATCH 07/18] Add constructor overload to construct configuration with connection string provider. Chain plain text connection string constructor with provider overload. --- .../AzureStorageAttachmentConfiguration.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs index 0809164..0a45948 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs @@ -15,11 +15,25 @@ public AzureStorageAttachmentConfiguration( string connectionString, string containerName = "attachments", string messagePropertyToIdentifyAttachmentBlob = "$attachment.blob", + Func messageMaxSizeReachedCriteria = null) + : this(new PlainTextConnectionStringProvider(connectionString), containerName, messagePropertyToIdentifyAttachmentBlob, messageMaxSizeReachedCriteria) + { + } + + /// Constructor to create new configuration object. + /// Provider to retrieve connection string such as + /// Storage container name + /// Message user property to use for blob URI + /// Default is always use attachments + public AzureStorageAttachmentConfiguration( + IProvideStorageConnectionString connectionStringProvider, + string containerName = "attachments", + string messagePropertyToIdentifyAttachmentBlob = "$attachment.blob", Func messageMaxSizeReachedCriteria = null) { Guard.AgainstEmpty(nameof(containerName), containerName); Guard.AgainstEmpty(nameof(messagePropertyToIdentifyAttachmentBlob), messagePropertyToIdentifyAttachmentBlob); - ConnectionString = connectionString; + ConnectionString = connectionStringProvider; ContainerName = containerName; MessagePropertyToIdentifyAttachmentBlob = messagePropertyToIdentifyAttachmentBlob; MessageMaxSizeReachedCriteria = GetMessageMaxSizeReachedCriteria(messageMaxSizeReachedCriteria); @@ -44,7 +58,7 @@ Func GetMessageMaxSizeReachedCriteria(Func message }; } - internal string ConnectionString { get; } + internal IProvideStorageConnectionString ConnectionString { get; } internal string ContainerName { get; } From 1c2309b4cc109d5f915301698f2da5250c05432c Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Thu, 8 Mar 2018 15:47:28 -0700 Subject: [PATCH 08/18] Replace ConnectionString with ConnectionStringProvider --- src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs | 2 +- .../AzureStorageAttachmentConfiguration.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs index 51e7337..1425a2d 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs @@ -19,7 +19,7 @@ class AzureStorageAttachment : ServiceBusPlugin public AzureStorageAttachment(AzureStorageAttachmentConfiguration configuration) { Guard.AgainstNull(nameof(configuration), configuration); - var account = CloudStorageAccount.Parse(configuration.ConnectionString); + var account = CloudStorageAccount.Parse(configuration.ConnectionStringProvider.GetConnectionString()); client = new Lazy(() => account.CreateCloudBlobClient()); this.configuration = configuration; } diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs index 0a45948..2b457c9 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachmentConfiguration.cs @@ -33,7 +33,7 @@ public AzureStorageAttachmentConfiguration( { Guard.AgainstEmpty(nameof(containerName), containerName); Guard.AgainstEmpty(nameof(messagePropertyToIdentifyAttachmentBlob), messagePropertyToIdentifyAttachmentBlob); - ConnectionString = connectionStringProvider; + ConnectionStringProvider = connectionStringProvider; ContainerName = containerName; MessagePropertyToIdentifyAttachmentBlob = messagePropertyToIdentifyAttachmentBlob; MessageMaxSizeReachedCriteria = GetMessageMaxSizeReachedCriteria(messageMaxSizeReachedCriteria); @@ -58,7 +58,7 @@ Func GetMessageMaxSizeReachedCriteria(Func message }; } - internal IProvideStorageConnectionString ConnectionString { get; } + internal IProvideStorageConnectionString ConnectionStringProvider { get; } internal string ContainerName { get; } From d3480d8f6ce23854efb3c02c4b2c627efb7db30d Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Thu, 8 Mar 2018 15:48:28 -0700 Subject: [PATCH 09/18] Replace raw connection string with connection string provider for all tests --- .../AzureStorageAttachmentConfigurationTests.cs | 7 ++++--- .../AzureStorageEmulatorFixture.cs | 2 ++ .../When_receiving_message.cs | 5 ++--- .../When_sending_message.cs | 12 ++++++------ .../When_sending_message_with_sas_uri.cs | 2 +- .../When_using_receive_only_plugin.cs | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs index 2facd56..b9cd0ae 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs @@ -9,9 +9,9 @@ public class AzureStorageAttachmentConfigurationTests [Fact] public void Should_apply_defaults_for_missing_arguments() { - var configuration = new AzureStorageAttachmentConfiguration("connectionString") + var configuration = new AzureStorageAttachmentConfiguration(new PlainTextConnectionStringProvider("connectionString")) .WithSasUri(); - Assert.Equal("connectionString", configuration.ConnectionString); + Assert.Equal("connectionString", configuration.ConnectionStringProvider.GetConnectionString()); Assert.NotEmpty(configuration.ContainerName); Assert.NotEmpty(configuration.MessagePropertyToIdentifyAttachmentBlob); Assert.Equal(AzureStorageAttachmentConfigurationExtensions.DefaultSasTokenValidationTime.Days, configuration.SasTokenValidationTime.Value.Days); @@ -22,7 +22,8 @@ public void Should_apply_defaults_for_missing_arguments() [Fact] public void Should_not_accept_negative_token_validation_time() { - Assert.Throws(() => new AzureStorageAttachmentConfiguration("connectionString").WithSasUri(sasTokenValidationTime: TimeSpan.FromHours(-4))); + Assert.Throws(() => + new AzureStorageAttachmentConfiguration(new PlainTextConnectionStringProvider("connectionString")).WithSasUri(sasTokenValidationTime: TimeSpan.FromHours(-4))); } } } \ No newline at end of file diff --git a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs index 38233b8..51e0191 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageEmulatorFixture.cs @@ -9,6 +9,8 @@ public class AzureStorageEmulatorFixture { + public static IProvideStorageConnectionString ConnectionStringProvider = new PlainTextConnectionStringProvider("UseDevelopmentStorage=true"); + public AzureStorageEmulatorFixture() { AzureStorageEmulatorManager.StartStorageEmulator(); diff --git a/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs b/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs index 446df1e..dc62c28 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/When_receiving_message.cs @@ -9,7 +9,6 @@ namespace ServiceBus.AttachmentPlugin.Tests public class When_receiving_message : IClassFixture { - [Fact] public async Task Should_throw_exception_with_blob_path_for_found_that_cant_be_found() { @@ -21,11 +20,11 @@ public async Task Should_throw_exception_with_blob_path_for_found_that_cant_be_f }; var sendingPlugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString: "UseDevelopmentStorage=true", containerName: "attachments")); + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments")); await sendingPlugin.BeforeMessageSend(message); var receivingPlugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString: "UseDevelopmentStorage=true", containerName: "attachments-wrong-containers")); + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments-wrong-containers")); var exception = await Assert.ThrowsAsync(() => receivingPlugin.AfterMessageReceive(message)); Assert.Contains("attachments-wrong-containers", actualString: exception.Message); diff --git a/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs b/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs index 5c0f914..58af50f 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs @@ -19,7 +19,7 @@ public async Task Should_nullify_body_when_body_should_be_sent_as_attachment() MessageId = Guid.NewGuid().ToString(), }; var plugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString:"UseDevelopmentStorage=true", containerName:"attachments", messagePropertyToIdentifyAttachmentBlob:"attachment-id")); + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName:"attachments", messagePropertyToIdentifyAttachmentBlob:"attachment-id")); var result = await plugin.BeforeMessageSend(message); Assert.Null(result.Body); @@ -37,7 +37,7 @@ public async Task Should_leave_body_as_is_for_message_not_exceeding_max_size() TimeToLive = TimeSpan.FromHours(1) }; var plugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString:"UseDevelopmentStorage=true", containerName:"attachments", messagePropertyToIdentifyAttachmentBlob:"attachment-id", + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName:"attachments", messagePropertyToIdentifyAttachmentBlob:"attachment-id", messageMaxSizeReachedCriteria:msg => msg.Body.Length > 100)); var result = await plugin.BeforeMessageSend(message); @@ -56,13 +56,13 @@ public async Task Should_set_valid_until_datetime_on_blob_same_as_message_TTL() TimeToLive = TimeSpan.FromHours(1) }; var dateTimeNowUtc = new DateTime(2017, 1, 2); - var configuration = new AzureStorageAttachmentConfiguration(connectionString:"UseDevelopmentStorage=true", containerName:"attachments", + var configuration = new AzureStorageAttachmentConfiguration(connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName:"attachments", messagePropertyToIdentifyAttachmentBlob:"attachment-id"); AzureStorageAttachment.DateTimeFunc = () => dateTimeNowUtc; var plugin = new AzureStorageAttachment(configuration); await plugin.BeforeMessageSend(message); - var account = CloudStorageAccount.Parse(configuration.ConnectionString); + var account = CloudStorageAccount.Parse(configuration.ConnectionStringProvider.GetConnectionString()); var client = account.CreateCloudBlobClient(); var container = client.GetContainerReference(configuration.ContainerName); var blobName = (string)message.UserProperties[configuration.MessagePropertyToIdentifyAttachmentBlob]; @@ -79,7 +79,7 @@ public async Task Should_receive_it() var bytes = Encoding.UTF8.GetBytes(payload); var message = new Message(bytes); var configuration = new AzureStorageAttachmentConfiguration( - connectionString: "UseDevelopmentStorage=true", containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id"); + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id"); var plugin = new AzureStorageAttachment(configuration); await plugin.BeforeMessageSend(message); @@ -101,7 +101,7 @@ public async Task Should_not_set_sas_uri_by_default() MessageId = Guid.NewGuid().ToString(), }; var plugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString: "UseDevelopmentStorage=true", containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id")); + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id")); var result = await plugin.BeforeMessageSend(message); Assert.Null(result.Body); diff --git a/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message_with_sas_uri.cs b/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message_with_sas_uri.cs index f993f48..f1d6426 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message_with_sas_uri.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message_with_sas_uri.cs @@ -19,7 +19,7 @@ public async Task Should_set_sas_uri_when_specified() MessageId = Guid.NewGuid().ToString(), }; var plugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString: "UseDevelopmentStorage=true", containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id") + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id") .WithSasUri(sasTokenValidationTime: TimeSpan.FromHours(4), messagePropertyToIdentifySasUri: "mySasUriProperty")); var result = await plugin.BeforeMessageSend(message); diff --git a/src/ServiceBus.AttachmentPlugin.Tests/When_using_receive_only_plugin.cs b/src/ServiceBus.AttachmentPlugin.Tests/When_using_receive_only_plugin.cs index c902c54..19cc852 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/When_using_receive_only_plugin.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/When_using_receive_only_plugin.cs @@ -20,7 +20,7 @@ public async Task Should_download_attachment_using_provided_from_sas_uri() MessageId = Guid.NewGuid().ToString(), }; var plugin = new AzureStorageAttachment(new AzureStorageAttachmentConfiguration( - connectionString: "UseDevelopmentStorage=true", + connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id") From 95e3b53ce426be6aa22bfab35cf31556398306cd Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Fri, 9 Mar 2018 08:58:21 -0700 Subject: [PATCH 10/18] Add documentation for provider feature --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 1efee89..cb09b9c 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,16 @@ Default is to convert any body to attachment. new AzureStorageAttachmentConfiguration(storageConnectionString, message => message.Body.Length > 200 * 1024); ``` +### Configuring connection string provider + +When Storage connection string needs to be retrieved rather than passed in as a plain text, `AzureStorageAttachmentConfiguration` accepts implementation of `IProvideStorageConnectionString`. +The plugin comes with a `PlainTextConnectionStringProvider` and can be used in the following way. + +```c# +var provider = new PlainTextConnectionStringProvider("connectionString"); +var config = new AzureStorageAttachmentConfiguration(provider); +``` + ## Who's trusting this add-in in production ![Codit](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/images/using/Codit.png) From f2fa6e17b4e400cb6a343fb6bc18ba28b1c6f876 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Fri, 9 Mar 2018 08:58:53 -0700 Subject: [PATCH 11/18] Update badges (cosmetics) --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cb09b9c..47030bc 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,15 @@ Allows sending messages that exceed maximum size by implementing [Claim Check pattern](http://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html) with Azure Storage. -### Nuget package [![NuGet Status](https://buildstats.info/nuget/ServiceBus.AttachmentPlugin?includePreReleases=true)](https://www.nuget.org/packages/ServiceBus.AttachmentPlugin/) [![Build Status](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/LICENSE) [![Issues](https://img.shields.io/github/issues-raw/badges/shields/website.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin) +License: [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/LICENSE) + +Build status: [![Develop](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) [![Master](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) + +Opened issues: [![Issues](https://img.shields.io/github/issues-raw/badges/shields/website.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin) + +### Nuget package + +[![NuGet Status](https://buildstats.info/nuget/ServiceBus.AttachmentPlugin?includePreReleases=true)](https://www.nuget.org/packages/ServiceBus.AttachmentPlugin/) Available here http://nuget.org/packages/ServiceBus.AttachmentPlugin From 82751cc0757f9fea74f4938bae201d04c1016ed3 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Fri, 9 Mar 2018 10:45:48 -0700 Subject: [PATCH 12/18] Change IProvideStorageConnectionString to return connection string in async manner --- .../AzureStorageAttachmentConfigurationTests.cs | 5 +++-- .../When_sending_message.cs | 2 +- src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs | 5 ++++- src/ServiceBus.AttachmentPlugin/Guard.cs | 6 +++--- .../IProvideStorageConnectionString.cs | 4 +++- .../PlainTextConnectionStringProvider.cs | 6 ++++-- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs index b9cd0ae..bf462ef 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/AzureStorageAttachmentConfigurationTests.cs @@ -1,17 +1,18 @@ namespace ServiceBus.AttachmentPlugin.Tests { using System; + using System.Threading.Tasks; using Microsoft.Azure.ServiceBus; using Xunit; public class AzureStorageAttachmentConfigurationTests { [Fact] - public void Should_apply_defaults_for_missing_arguments() + public async Task Should_apply_defaults_for_missing_arguments() { var configuration = new AzureStorageAttachmentConfiguration(new PlainTextConnectionStringProvider("connectionString")) .WithSasUri(); - Assert.Equal("connectionString", configuration.ConnectionStringProvider.GetConnectionString()); + Assert.Equal("connectionString", await configuration.ConnectionStringProvider.GetConnectionString()); Assert.NotEmpty(configuration.ContainerName); Assert.NotEmpty(configuration.MessagePropertyToIdentifyAttachmentBlob); Assert.Equal(AzureStorageAttachmentConfigurationExtensions.DefaultSasTokenValidationTime.Days, configuration.SasTokenValidationTime.Value.Days); diff --git a/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs b/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs index 58af50f..c2bb150 100644 --- a/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs +++ b/src/ServiceBus.AttachmentPlugin.Tests/When_sending_message.cs @@ -62,7 +62,7 @@ public async Task Should_set_valid_until_datetime_on_blob_same_as_message_TTL() var plugin = new AzureStorageAttachment(configuration); await plugin.BeforeMessageSend(message); - var account = CloudStorageAccount.Parse(configuration.ConnectionStringProvider.GetConnectionString()); + var account = CloudStorageAccount.Parse(await configuration.ConnectionStringProvider.GetConnectionString()); var client = account.CreateCloudBlobClient(); var container = client.GetContainerReference(configuration.ContainerName); var blobName = (string)message.UserProperties[configuration.MessagePropertyToIdentifyAttachmentBlob]; diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs index 1425a2d..6831382 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs @@ -19,7 +19,10 @@ class AzureStorageAttachment : ServiceBusPlugin public AzureStorageAttachment(AzureStorageAttachmentConfiguration configuration) { Guard.AgainstNull(nameof(configuration), configuration); - var account = CloudStorageAccount.Parse(configuration.ConnectionStringProvider.GetConnectionString()); + // TODO: review this in next version to avoid .GetAwaiter().GetResult(); + var connectionString = configuration.ConnectionStringProvider.GetConnectionString() + .GetAwaiter().GetResult(); + var account = CloudStorageAccount.Parse(connectionString); client = new Lazy(() => account.CreateCloudBlobClient()); this.configuration = configuration; } diff --git a/src/ServiceBus.AttachmentPlugin/Guard.cs b/src/ServiceBus.AttachmentPlugin/Guard.cs index 8e5a8b6..6790844 100644 --- a/src/ServiceBus.AttachmentPlugin/Guard.cs +++ b/src/ServiceBus.AttachmentPlugin/Guard.cs @@ -1,7 +1,7 @@ -using System; - -namespace ServiceBus.AttachmentPlugin +namespace ServiceBus.AttachmentPlugin { + using System; + static class Guard { public static void AgainstEmpty(string argumentName, string value) diff --git a/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs b/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs index 8499f67..63604ba 100644 --- a/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs +++ b/src/ServiceBus.AttachmentPlugin/IProvideStorageConnectionString.cs @@ -1,5 +1,7 @@ namespace ServiceBus.AttachmentPlugin { + using System.Threading.Tasks; + /// /// Storage account connection string provider. /// @@ -8,6 +10,6 @@ public interface IProvideStorageConnectionString /// /// Connection string for storage account to be used. /// - string GetConnectionString(); + Task GetConnectionString(); } } \ No newline at end of file diff --git a/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs b/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs index 18473e8..a249c90 100644 --- a/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs +++ b/src/ServiceBus.AttachmentPlugin/PlainTextConnectionStringProvider.cs @@ -1,5 +1,7 @@ namespace ServiceBus.AttachmentPlugin { + using System.Threading.Tasks; + /// /// Static connection string provider. /// @@ -17,9 +19,9 @@ public PlainTextConnectionStringProvider(string connectionString) /// /// Return connection string for Storage account. /// - public string GetConnectionString() + public Task GetConnectionString() { - return connectionString; + return Task.FromResult(connectionString); } } } \ No newline at end of file From 734f46f3f3de4e8692eae1d2b55c66e986e8fdda Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Fri, 9 Mar 2018 11:40:50 -0700 Subject: [PATCH 13/18] Fix develop branch shield --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47030bc..f60eb9b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Allows sending messages that exceed maximum size by implementing [Claim Check pa License: [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/LICENSE) -Build status: [![Develop](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) [![Master](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) +Build status: [![Develop](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/develop.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) [![Master](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) Opened issues: [![Issues](https://img.shields.io/github/issues-raw/badges/shields/website.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin) From 1a1b620d27c002c8fd999a312b852e0e46e1db58 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sat, 10 Mar 2018 22:54:18 +1100 Subject: [PATCH 14/18] remove .GetAwaiter().GetResult(); --- .../AzureStorageAttachment.cs | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs index 6831382..429ab41 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs @@ -1,6 +1,7 @@ namespace ServiceBus.AttachmentPlugin { using System; + using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.ServiceBus; using Microsoft.Azure.ServiceBus.Core; @@ -9,21 +10,17 @@ class AzureStorageAttachment : ServiceBusPlugin { + SemaphoreSlim semaphore= new SemaphoreSlim(1); const string MessageId = "_MessageId"; internal const string ValidUntilUtc = "_ValidUntilUtc"; internal const string DateFormat = "yyyy-MM-dd HH:mm:ss:ffffff Z"; - Lazy client; + CloudBlobClient client; AzureStorageAttachmentConfiguration configuration; public AzureStorageAttachment(AzureStorageAttachmentConfiguration configuration) { Guard.AgainstNull(nameof(configuration), configuration); - // TODO: review this in next version to avoid .GetAwaiter().GetResult(); - var connectionString = configuration.ConnectionStringProvider.GetConnectionString() - .GetAwaiter().GetResult(); - var account = CloudStorageAccount.Parse(connectionString); - client = new Lazy(() => account.CreateCloudBlobClient()); this.configuration = configuration; } @@ -33,12 +30,13 @@ public AzureStorageAttachment(AzureStorageAttachmentConfiguration configuration) public override async Task BeforeMessageSend(Message message) { + await InitializeClient().ConfigureAwait(false); if (!configuration.MessageMaxSizeReachedCriteria(message)) { return message; } - var container = client.Value.GetContainerReference(configuration.ContainerName); + var container = client.GetContainerReference(configuration.ContainerName); await container.CreateIfNotExistsAsync().ConfigureAwait(false); var blob = container.GetBlockBlobReference(Guid.NewGuid().ToString()); @@ -60,6 +58,21 @@ public override async Task BeforeMessageSend(Message message) return message; } + async Task InitializeClient() + { + await semaphore.WaitAsync().ConfigureAwait(false); + try + { + var connectionString = await configuration.ConnectionStringProvider.GetConnectionString().ConfigureAwait(false); + var account = CloudStorageAccount.Parse(connectionString); + client = account.CreateCloudBlobClient(); + } + finally + { + semaphore.Release(); + } + } + static void SetValidMessageId(ICloudBlob blob, string messageId) { if (!string.IsNullOrWhiteSpace(messageId)) @@ -96,7 +109,7 @@ public override async Task AfterMessageReceive(Message message) } else { - var container = client.Value.GetContainerReference(configuration.ContainerName); + var container = client.GetContainerReference(configuration.ContainerName); await container.CreateIfNotExistsAsync().ConfigureAwait(false); var blobName = (string)userProperties[configuration.MessagePropertyToIdentifyAttachmentBlob]; blob = container.GetBlockBlobReference(blobName); From 08607061b48b670ab4ef34a25516423de915f322 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Sat, 10 Mar 2018 22:56:25 +1100 Subject: [PATCH 15/18] early exit --- src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs index 429ab41..5307eb0 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs @@ -60,7 +60,15 @@ public override async Task BeforeMessageSend(Message message) async Task InitializeClient() { + if (client != null) + { + return; + } await semaphore.WaitAsync().ConfigureAwait(false); + if (client != null) + { + return; + } try { var connectionString = await configuration.ConnectionStringProvider.GetConnectionString().ConfigureAwait(false); From 21c30a94ffce58c0f3b5608526a0a5e163eaad95 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Sat, 10 Mar 2018 09:19:53 -0700 Subject: [PATCH 16/18] Initialize client when sending as well to avoid null reference exception --- src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs index 5307eb0..2def2d7 100644 --- a/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs +++ b/src/ServiceBus.AttachmentPlugin/AzureStorageAttachment.cs @@ -31,6 +31,7 @@ public AzureStorageAttachment(AzureStorageAttachmentConfiguration configuration) public override async Task BeforeMessageSend(Message message) { await InitializeClient().ConfigureAwait(false); + if (!configuration.MessageMaxSizeReachedCriteria(message)) { return message; @@ -64,11 +65,14 @@ async Task InitializeClient() { return; } + await semaphore.WaitAsync().ConfigureAwait(false); + if (client != null) { return; } + try { var connectionString = await configuration.ConnectionStringProvider.GetConnectionString().ConfigureAwait(false); @@ -117,6 +121,8 @@ public override async Task AfterMessageReceive(Message message) } else { + await InitializeClient().ConfigureAwait(false); + var container = client.GetContainerReference(configuration.ContainerName); await container.CreateIfNotExistsAsync().ConfigureAwait(false); var blobName = (string)userProperties[configuration.MessagePropertyToIdentifyAttachmentBlob]; From 36ef2131bdae9ca298236dfcdc09c13be0c73ccb Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Sat, 10 Mar 2018 11:20:37 -0700 Subject: [PATCH 17/18] Update build shields with text --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f60eb9b..cd774d7 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,10 @@ Allows sending messages that exceed maximum size by implementing [Claim Check pattern](http://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html) with Azure Storage. -License: [![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/LICENSE) - -Build status: [![Develop](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/develop.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) [![Master](https://img.shields.io/appveyor/ci/seanfeldman/ServiceBus-AttachmentPlugin/master.svg?style=flat-square)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) - -Opened issues: [![Issues](https://img.shields.io/github/issues-raw/badges/shields/website.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin) +[![license](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin/blob/master/LICENSE) +[![develop build status](https://ci.appveyor.com/api/projects/status/kpw7nfmr4femj29y/branch/develop.svg?style=flat-square&pendingText=develop%20%E2%80%A3%20pending&failingText=develop%20%E2%80%A3%20failing&passingText=develop%20%E2%80%A3%20passing)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) +[![master build status](https://ci.appveyor.com/api/projects/status/kpw7nfmr4femj29y/branch/master.svg?style=flat-square&pendingText=master%20%E2%80%A3%20pending&failingText=master%20%E2%80%A3%20failing&passingText=master%20%E2%80%A3%20passing)](https://ci.appveyor.com/project/seanfeldman/ServiceBus-AttachmentPlugin) +[![opened issues](https://img.shields.io/github/issues-raw/badges/shields/website.svg)](https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin) ### Nuget package From 3f9266de47cba0a898e22b7125bf3d60804a0d69 Mon Sep 17 00:00:00 2001 From: Sean Feldman Date: Sun, 11 Mar 2018 21:00:26 -0600 Subject: [PATCH 18/18] Bump minor version for the next release --- .../ServiceBus.AttachmentPlugin.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ServiceBus.AttachmentPlugin/ServiceBus.AttachmentPlugin.csproj b/src/ServiceBus.AttachmentPlugin/ServiceBus.AttachmentPlugin.csproj index c29f4e7..e90cbff 100644 --- a/src/ServiceBus.AttachmentPlugin/ServiceBus.AttachmentPlugin.csproj +++ b/src/ServiceBus.AttachmentPlugin/ServiceBus.AttachmentPlugin.csproj @@ -2,7 +2,7 @@ Microsoft Azure ServiceBus attachment plugin - 2.1.0 + 2.2.0 Sean Feldman netstandard2.0;net461 Azure;Service Bus;ServiceBus;.NET;AMQP;IoT;Queue;Topic;Attachment;Plugin