예제 #1
0
        static async Task ReceiveSessionMessagesAsync()
        {
            Console.WriteLine("===================================================================");
            Console.WriteLine("Accepting sessions in the reverse order of sends for demo purposes");
            Console.WriteLine("===================================================================");

            var configuration = new AzureStorageAttachmentConfiguration(StorageConnectionString, containerName: "ovp");

            sessionClient.RegisterAzureStorageAttachmentPlugin(configuration);

            // AcceptMessageSessionAsync(i.ToString()) as below with session id as parameter will try to get a session with that sessionId.
            // AcceptMessageSessionAsync() without any messages will try to get any available session with messages associated with that session.
            IMessageSession session = await sessionClient.AcceptMessageSessionAsync();

            if (session != null)
            {
                Message message = await session.ReceiveAsync();

                var          stream = new MemoryStream(message.Body);
                StreamReader reader = new StreamReader(stream);
                string       text   = reader.ReadToEnd();

                Console.WriteLine($"message body : {text}");

                await session.CompleteAsync(message.SystemProperties.LockToken);
            }
        }
예제 #2
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            //log.LogInformation("C# HTTP trigger function processed a request.");

            string requestContent = await new StreamReader(req.Body).ReadToEndAsync();

            log.LogInformation($"Received payload from client. Sending to Service Bus as Attachment.");

            // Getting connection information
            var serviceBusConnectionString = Environment.GetEnvironmentVariable("SERVICE_BUS_CONNECTION_STRING");
            var queueName = Environment.GetEnvironmentVariable("QUEUE_NAME");
            var storageConnectionString = Environment.GetEnvironmentVariable("STORAGE_CONNECTION_STRING");

            // Creating config for sending message
            var config = new AzureStorageAttachmentConfiguration(storageConnectionString);

            // Creating and registering the sender using Service Bus Connection String and Queue Name
            var sender = new MessageSender(serviceBusConnectionString, queueName);

            sender.RegisterAzureStorageAttachmentPlugin(config);

            // Create payload
            var payload        = new { data = requestContent };
            var serialized     = JsonConvert.SerializeObject(payload);
            var payloadAsBytes = Encoding.UTF8.GetBytes(serialized);
            var message        = new Message(payloadAsBytes);

            // Send the message
            await sender.SendAsync(message);

            return(new OkObjectResult($"Message is sent!"));
        }
        public async Task Should_set_valid_until_datetime_on_blob_same_as_message_TTL()
        {
            var payload = "payload";
            var bytes   = Encoding.UTF8.GetBytes(payload);
            var message = new Message(bytes)
            {
                MessageId  = Guid.NewGuid().ToString(),
                TimeToLive = TimeSpan.FromHours(1)
            };
            var dateTimeNowUtc = new DateTime(2017, 1, 2);
            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(await configuration.ConnectionStringProvider.GetConnectionString());
            var client    = account.CreateCloudBlobClient();
            var container = client.GetContainerReference(configuration.ContainerName);
            var blobName  = (string)message.UserProperties[configuration.MessagePropertyToIdentifyAttachmentBlob];
            var blob      = container.GetBlockBlobReference(blobName);
            await blob.FetchAttributesAsync();

            var validUntil = blob.Metadata[AzureStorageAttachment.ValidUntilUtc];

            Assert.Equal(dateTimeNowUtc.Add(message.TimeToLive).ToString(AzureStorageAttachment.DateFormat), validUntil);
        }
        static async Task Main(string[] args)
        {
            var connectionString = Environment.GetEnvironmentVariable("AzureServiceBus_ConnectionString");
            var managementClient = new ManagementClient(connectionString);

            if (!await managementClient.QueueExistsAsync("attachments"))
            {
                await managementClient.CreateQueueAsync("attachments");
            }

            var queueClient = new QueueClient(connectionString, "attachments", ReceiveMode.ReceiveAndDelete);

            var configuration = new AzureStorageAttachmentConfiguration(new KeyVaultProvider("https://keyvaultplugin.vault.azure.net/secrets/storage-connection-string"));

            queueClient.RegisterAzureStorageAttachmentPlugin(configuration);
            await queueClient.SendAsync(new Message(Encoding.UTF8.GetBytes("hello")));

            var messageReceiver = new MessageReceiver(connectionString, "attachments", ReceiveMode.ReceiveAndDelete);

            messageReceiver.RegisterAzureStorageAttachmentPlugin(configuration);

            var message = await messageReceiver.ReceiveAsync(TimeSpan.FromSeconds(3));

            Console.WriteLine($"Received message with body: {Encoding.UTF8.GetString(message.Body)}");

            Console.ReadLine();
        }
예제 #5
0
    void Configuring_connection_string_provider(string connectionString)
    {
        #region Configuring_connection_string_provider

        var provider = new PlainTextConnectionStringProvider(connectionString);
        var config   = new AzureStorageAttachmentConfiguration(provider);

        #endregion
    }
예제 #6
0
    async Task Upload_attachment_without_registering_plugin(Message message, AzureStorageAttachmentConfiguration config)
    {
        #region Upload_attachment_without_registering_plugin

        //To make it possible to use SAS URI when downloading, use WithBlobSasUri() when creating configuration object
        await message.UploadAzureStorageAttachment(config);

        #endregion
    }
예제 #7
0
    void Configuring_plugin_using_StorageCredentials(string connectionString, string blobEndpoint)
    {
        #region Configuring_plugin_using_StorageCredentials

        var credentials = new StorageCredentials(/*Shared key OR Service SAS OR Container SAS*/);
        var config      = new AzureStorageAttachmentConfiguration(credentials, blobEndpoint);

        #endregion
    }
예제 #8
0
    void ConfigurationAndRegistration(string connectionString, string queueName, string storageConnectionString)
    {
        #region ConfigurationAndRegistration

        var sender = new MessageSender(connectionString, queueName);
        var config = new AzureStorageAttachmentConfiguration(storageConnectionString);
        sender.RegisterAzureStorageAttachmentPlugin(config);

        #endregion
    }
        public void Should_get_back_AzureStorageAttachment_for_connection_string_based_configuration()
        {
            IClientEntity client = new FakeClientEntity("fake", string.Empty, RetryPolicy.Default);

            var azureStorageAttachmentConfiguration = new AzureStorageAttachmentConfiguration(ConnectionString);

            var registeredPlugin = AzureStorageAttachmentExtensions.RegisterAzureStorageAttachmentPlugin(client, azureStorageAttachmentConfiguration);

            Assert.Equal(registeredPlugin, client.RegisteredPlugins.First());
            Assert.IsAssignableFrom <AzureStorageAttachment>(registeredPlugin);
        }
        public void Should_get_back_AzureStorageAttachment_for_container_sas_based_configuration()
        {
            IClientEntity client = new FakeClientEntity("fake", string.Empty, RetryPolicy.Default);

            var azureStorageAttachmentConfiguration = new AzureStorageAttachmentConfiguration(new StorageCredentials("?sv=2018-03-28&sr=c&sig=5XxlRKoP4yEmibM2HhJlQuV7MG3rYgQXD89mLpNp%2F24%3D"), "http://127.0.0.1:10000/devstoreaccount1");

            var registeredPlugin = AzureStorageAttachmentExtensions.RegisterAzureStorageAttachmentPlugin(client, azureStorageAttachmentConfiguration);

            Assert.Equal(registeredPlugin, client.RegisteredPlugins.First());
            Assert.IsAssignableFrom <AzureStorageAttachment>(registeredPlugin);
        }
        public async Task Should_apply_defaults_for_missing_arguments()
        {
            var configuration = new AzureStorageAttachmentConfiguration(new PlainTextConnectionStringProvider(ConnectionString))
                                .WithBlobSasUri();

            Assert.Equal(ConnectionString, await configuration.ConnectionStringProvider !.GetConnectionString());
            Assert.NotEmpty(configuration.ContainerName);
            Assert.NotEmpty(configuration.MessagePropertyToIdentifyAttachmentBlob);
            Assert.Equal(AzureStorageAttachmentConfigurationExtensions.DefaultSasTokenValidationTime.Days, configuration.BlobSasTokenValidationTime !.Value.Days);
            Assert.Equal(AzureStorageAttachmentConfigurationConstants.DefaultMessagePropertyToIdentitySasUri, configuration.MessagePropertyForBlobSasUri);
            Assert.True(configuration.MessageMaxSizeReachedCriteria(new Message()));
        }
예제 #12
0
    void Configure_body_override(string connectionString, string queueName, string storageConnectionString)
    {
        #region Configure_body_override

        var sender = new MessageSender(connectionString, queueName);
        var config = new AzureStorageAttachmentConfiguration(storageConnectionString)
                     .OverrideBody(message => Array.Empty <byte>());

        sender.RegisterAzureStorageAttachmentPlugin(config);

        #endregion
    }
예제 #13
0
    async Task AttachmentReceiving(string connectionString, string entityPath, AzureStorageAttachmentConfiguration config)
    {
        #region AttachmentReceiving

        var receiver = new MessageReceiver(connectionString, entityPath, ReceiveMode.ReceiveAndDelete);
        receiver.RegisterAzureStorageAttachmentPlugin(config);
        var message = await receiver.ReceiveAsync().ConfigureAwait(false);

        // message will contain the original payload

        #endregion
    }
예제 #14
0
        public void Should_get_back_disposable_object_for_full_plugin()
        {
            var client = new FakeClientEntity("fake", string.Empty, RetryPolicy.Default);

            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var registeredPlugin = AzureStorageAttachmentExtensions.RegisterAzureStorageAttachmentPlugin(client, configuration);

            Assert.Equal(registeredPlugin, client.RegisteredPlugins.First());
            Assert.IsAssignableFrom <ServiceBusPlugin>(registeredPlugin);
            Assert.IsAssignableFrom <IDisposable>(registeredPlugin);
        }
예제 #15
0
    void ConfigurationAndRegistrationSas(string connectionString, string queueName, string storageConnectionString)
    {
        #region ConfigurationAndRegistrationSas

        var sender = new MessageSender(connectionString, queueName);
        var config = new AzureStorageAttachmentConfiguration(storageConnectionString)
                     .WithBlobSasUri(
            sasTokenValidationTime: TimeSpan.FromHours(4),
            messagePropertyToIdentifySasUri: "mySasUriProperty");
        sender.RegisterAzureStorageAttachmentPlugin(config);

        #endregion
    }
        public void Should_throw_if_plugin_was_disposed()
        {
            var client = new FakeClientEntity("fake", string.Empty, RetryPolicy.Default);

            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var registeredPlugin = AzureStorageAttachmentExtensions.RegisterAzureStorageAttachmentPlugin(client, configuration);

            ((IDisposable)registeredPlugin).Dispose();

            Assert.ThrowsAsync <ObjectDisposedException>(() => registeredPlugin.BeforeMessageSend(null));
            Assert.ThrowsAsync <ObjectDisposedException>(() => registeredPlugin.AfterMessageReceive(null));
        }
예제 #17
0
    async Task Download_attachment_without_registering_plugin(Message message, AzureStorageAttachmentConfiguration config)
    {
        #region Download_attachment_without_registering_plugin

        //Using SAS URI with default message property ($attachment.sas.uri)
        await message.DownloadAzureStorageAttachment();

        //Using SAS URI with custom message property
        await message.DownloadAzureStorageAttachment("$custom-attachment.sas.uri");

        //Using configuration object
        await message.DownloadAzureStorageAttachment(config);

        #endregion
    }
        public void Configure()
        {
            // Getting connection information from app.config
            string storageConnectionString    = ConfigurationManager.AppSettings?["STORAGE_CONNECTION_STRING"];
            string serviceBusConnectionString = ConfigurationManager.AppSettings?["SERVICE_BUS_CONNECTION_STRING"];
            string queueName = ConfigurationManager.AppSettings?["QUEUE_NAME"];

            // Creating config for receiving message
            var config = new AzureStorageAttachmentConfiguration(storageConnectionString);

            // Creating and registering the receiver using Service Bus Connection String and Queue Name
            // This can also be done using SAS tokens - Refer to plugin usage here - https://github.com/SeanFeldman/ServiceBus.AttachmentPlugin
            _receiver = new MessageReceiver(serviceBusConnectionString, queueName, ReceiveMode.ReceiveAndDelete);
            _receiver.RegisterAzureStorageAttachmentPlugin(config);
        }
예제 #19
0
    void Configure_blob_name_override(string connectionString, string queueName, string storageConnectionString)
    {
        #region Configure_blob_name_override

        var sender = new MessageSender(connectionString, queueName);
        var config = new AzureStorageAttachmentConfiguration(storageConnectionString)
                     .OverrideBlobName(message =>
        {
            var tenantId = message.UserProperties["tenantId"].ToString();
            var blobName = $"{tenantId}/{message.MessageId}";
            return(blobName);
        });
        sender.RegisterAzureStorageAttachmentPlugin(config);

        #endregion
    }
예제 #20
0
        private static async Task ReceiveMessagesAsync()
        {
            Console.WriteLine("===================================================================");
            Console.WriteLine("Accepting message in the reverse order of sends for demo purposes");
            Console.WriteLine("===================================================================");

            var configuration = new AzureStorageAttachmentConfiguration(StorageConnectionString);

            messageReceiver.RegisterAzureStorageAttachmentPlugin(configuration);

            var message = await messageReceiver.ReceiveAsync().ConfigureAwait(false);

            var          stream = new MemoryStream(message.Body);
            StreamReader reader = new StreamReader(stream);
            string       text   = reader.ReadToEnd();
        }
        public async Task Should_send_and_receive_with_configuration()
        {
            var payload       = "payload";
            var bytes         = Encoding.UTF8.GetBytes(payload);
            var message       = new Message(bytes);
            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            await message.UploadAzureStorageAttachment(configuration);

            Assert.Null(message.Body);

            var receivedMessage = await message.DownloadAzureStorageAttachment(configuration);

            Assert.Equal(payload, Encoding.UTF8.GetString(receivedMessage.Body));
        }
        public async Task Should_receive_it_using_connection_string()
        {
            var payload       = "payload";
            var bytes         = Encoding.UTF8.GetBytes(payload);
            var message       = new Message(bytes);
            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var plugin = new AzureStorageAttachment(configuration);
            await plugin.BeforeMessageSend(message);

            Assert.Null(message.Body);

            var receivedMessage = await plugin.AfterMessageReceive(message);

            Assert.Equal(payload, Encoding.UTF8.GetString(receivedMessage.Body));
        }
예제 #23
0
        public async Task Should_receive_it_using_container_sas()
        {
            var payload       = "payload";
            var bytes         = Encoding.UTF8.GetBytes(payload);
            var message       = new Message(bytes);
            var credentials   = new StorageCredentials(await fixture.GetContainerSas("attachments"));
            var configuration = new AzureStorageAttachmentConfiguration(credentials, fixture.GetBlobEndpoint(), messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var plugin = new AzureStorageAttachment(configuration);
            await plugin.BeforeMessageSend(message);

            Assert.Null(message.Body);

            var receivedMessage = await plugin.AfterMessageReceive(message);

            Assert.Equal(payload, Encoding.UTF8.GetString(receivedMessage.Body));
        }
예제 #24
0
        public async Task Should_not_reupload_blob_if_one_is_already_assigned()
        {
            var payload       = "payload";
            var bytes         = Encoding.UTF8.GetBytes(payload);
            var message       = new Message(bytes);
            var credentials   = new StorageCredentials(await fixture.GetContainerSas("attachments"));
            var configuration = new AzureStorageAttachmentConfiguration(credentials, fixture.GetBlobEndpoint(), messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var plugin = new AzureStorageAttachment(configuration);

            var processedMessage = await plugin.BeforeMessageSend(message);

            var blobId = processedMessage.UserProperties["attachment-id"];

            var reprocessedMessage = await plugin.BeforeMessageSend(message);

            Assert.Equal(blobId, reprocessedMessage.UserProperties["attachment-id"]);
        }
        public async Task Should_not_reupload_blob_if_one_is_already_assigned()
        {
            var payload       = "payload";
            var bytes         = Encoding.UTF8.GetBytes(payload);
            var message       = new Message(bytes);
            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var plugin = new AzureStorageAttachment(configuration);

            var processedMessage = await plugin.BeforeMessageSend(message);

            var blobId = processedMessage.UserProperties["attachment-id"];

            var reprocessedMessage = await plugin.BeforeMessageSend(message);

            Assert.Equal(blobId, reprocessedMessage.UserProperties["attachment-id"]);
        }
        public async Task Should_not_throw_if_plugin_was_not_disposed()
        {
            var client = new FakeClientEntity("fake", string.Empty, RetryPolicy.Default);

            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var registeredPlugin = AzureStorageAttachmentExtensions.RegisterAzureStorageAttachmentPlugin(client, configuration);

            var client2 = new FakeClientEntity("fake2", string.Empty, RetryPolicy.Default);

            client2.RegisterPlugin(registeredPlugin);

            var message = new Message(new byte[] {});
            await registeredPlugin.BeforeMessageSend(message);

            await registeredPlugin.AfterMessageReceive(message);
        }
        public async Task Should_be_able_to_send_if_container_was_not_found()
        {
            await fixture.DeleteContainer("attachments-that-didnt-exist");

            var payload       = "payload";
            var bytes         = Encoding.UTF8.GetBytes(payload);
            var message       = new Message(bytes);
            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider, containerName: "attachments-that-didnt-exist", messagePropertyToIdentifyAttachmentBlob: "attachment-id");

            var plugin = new AzureStorageAttachment(configuration);
            await plugin.BeforeMessageSend(message);

            Assert.Null(message.Body);

            var receivedMessage = await plugin.AfterMessageReceive(message);

            Assert.Equal(payload, Encoding.UTF8.GetString(receivedMessage.Body));
        }
        public async Task Should_be_able_to_override_blob_name_and_receive_message_payload_using_the_new_name()
        {
            var payload = "payload";
            var bytes   = Encoding.UTF8.GetBytes(payload);
            var message = new Message(bytes)
            {
                MessageId = Guid.NewGuid().ToString("N")
            };
            var configuration = new AzureStorageAttachmentConfiguration(
                connectionStringProvider: AzureStorageEmulatorFixture.ConnectionStringProvider);

            configuration.OverrideBlobName(msg => $"test/{msg.MessageId}");

            await message.UploadAzureStorageAttachment(configuration);

            Assert.Null(message.Body);

            var receivedMessage = await message.DownloadAzureStorageAttachment(configuration);

            Assert.Equal(payload, Encoding.UTF8.GetString(receivedMessage.Body));
            Assert.Equal($"test/{message.MessageId}", message.UserProperties[configuration.MessagePropertyToIdentifyAttachmentBlob]);
        }