diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md
index 35c890e1e4f2..fcd9368e12bc 100644
--- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/README.md
@@ -308,6 +308,10 @@ public static class BlobFunction_EnumerateBlobs_BlobClient
}
```
+### Configuring the extension
+
+Please refer to [sample functions app].
+
## Troubleshooting
Please refer to [Monitor Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-monitoring) for troubleshooting guidance.
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Directory.Build.props b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Directory.Build.props
new file mode 100644
index 000000000000..7c94cde1f3a2
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Directory.Build.props
@@ -0,0 +1,15 @@
+
+
+
+ true
+ false
+ true
+ false
+
+
+
+
+
+ false
+
+
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj
new file mode 100644
index 000000000000..832daf1b3dff
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj
@@ -0,0 +1,21 @@
+
+
+ netcoreapp3.1
+ $(RequiredTargetFrameworks)
+ v3
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+ Never
+
+
+
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/README.md
new file mode 100644
index 000000000000..06573909d191
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/README.md
@@ -0,0 +1,6 @@
+# Sample Azure Function App for Azure Azure WebJobs Storage Blobs
+
+This sample Azure Function application shows usage of Azure Azure WebJobs Storage Blobs extension.
+`SampleFunctions` contains a pair of functions that work with an Azure Storage Blobs
+as well as sample configuration files `host.json` and `local.settings.json`. Settings present in `host.json` are optional and used values can be different than defaults.
+Connection string present in `local.settings.json` points to [Azurite](https://github.com/Azure/Azurite), however any valid connection string will work.
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/SampleFunctions.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/SampleFunctions.cs
new file mode 100644
index 000000000000..4bbe99c7125d
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/SampleFunctions.cs
@@ -0,0 +1,40 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using System;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App
+{
+ ///
+ /// A pair of sample functions. First that updates a blob on schedule and second that listens to blob changes.
+ ///
+ public static class SampleFunctions
+ {
+ ///
+ /// This function executes on schedule, produces a new content and udpates the blob.
+ ///
+ [FunctionName("SampleBlobContentUpdater")]
+ [return: Blob("sample-container/sample-blob")]
+ public static string UpdateSampleBlobContent([TimerTrigger("*/30 * * * * *")] TimerInfo timerInfo, ILogger logger)
+ {
+ if (timerInfo.IsPastDue)
+ {
+ logger.LogInformation("Timer is running late!");
+ }
+ var now = DateTime.Now;
+ logger.LogInformation($"C# Timer trigger function executed at: {now}");
+
+ return $"Sample blob content produced at: {now}";
+ }
+
+ ///
+ /// This functions is executed when blob is modified.
+ ///
+ [FunctionName("SampleBlobUpdateListener")]
+ public static void OnBlobUpdate([BlobTrigger("sample-container/sample-blob")] string content, ILogger logger)
+ {
+ logger.LogInformation("Blob has been updated, content: {content}", content);
+ }
+ }
+}
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/host.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/host.json
new file mode 100644
index 000000000000..1d897c06e943
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/host.json
@@ -0,0 +1,16 @@
+{
+ "version": "2.0",
+ "logging": {
+ "applicationInsights": {
+ "samplingExcludedTypes": "Request",
+ "samplingSettings": {
+ "isEnabled": true
+ }
+ }
+ },
+ "extensions": {
+ "blobs": {
+ "maxDegreeOfParallelism": "5"
+ }
+ }
+}
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/local.settings.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/local.settings.json
new file mode 100644
index 000000000000..b818866fce36
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/functionapp/local.settings.json
@@ -0,0 +1,7 @@
+{
+ "IsEncrypted": false,
+ "Values": {
+ "AzureWebJobsStorage": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;",
+ "FUNCTIONS_WORKER_RUNTIME": "dotnet"
+ }
+}
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/BlobExtensionSamples.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/BlobExtensionSamples.cs
similarity index 100%
rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/BlobExtensionSamples.cs
rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/BlobExtensionSamples.cs
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj
similarity index 57%
rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj
rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj
index a32e1d8abd6a..aa37cf960406 100644
--- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj
@@ -8,7 +8,7 @@
-
-
+
+
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md
index 49f8d56c6be3..a7c0d2371d1e 100644
--- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/README.md
@@ -259,6 +259,10 @@ public static class Function_BindingToQueueClient
}
```
+### Configuring the extension
+
+Please refer to [sample functions app].
+
## Troubleshooting
Please refer to [Monitor Azure Functions](https://docs.microsoft.com/azure/azure-functions/functions-monitoring) for troubleshooting guidance.
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Directory.Build.props b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Directory.Build.props
new file mode 100644
index 000000000000..7c94cde1f3a2
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Directory.Build.props
@@ -0,0 +1,15 @@
+
+
+
+ true
+ false
+ true
+ false
+
+
+
+
+
+ false
+
+
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj
new file mode 100644
index 000000000000..1120b47412e5
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj
@@ -0,0 +1,21 @@
+
+
+ netcoreapp3.1
+ $(RequiredTargetFrameworks)
+ v3
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+ Never
+
+
+
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/README.md b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/README.md
new file mode 100644
index 000000000000..430afe1f0d93
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/README.md
@@ -0,0 +1,6 @@
+# Sample Azure Function App for Azure Azure WebJobs Storage Queues
+
+This sample Azure Function application shows usage of Azure Azure WebJobs Storage Queues extension.
+`SampleFunctions` contains a pair of producer and consumer that work with an Azure Storage Queue
+as well as sample configuration files `host.json` and `local.settings.json`. Settings present in `host.json` are optional and used values can be different than defaults.
+Connection string present in `local.settings.json` points to [Azurite](https://github.com/Azure/Azurite), however any valid connection string will work.
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/SampleFunctions.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/SampleFunctions.cs
new file mode 100644
index 000000000000..128e9e3d8b5e
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/SampleFunctions.cs
@@ -0,0 +1,40 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License.
+
+using System;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App
+{
+ ///
+ /// A pair of sample functions. First that produces messages on schedule and second that consumes them.
+ ///
+ public static class SampleFunctions
+ {
+ ///
+ /// This function executes on schedule, produces a message and inserts it into the queue.
+ ///
+ [FunctionName("SampleQueueMessageProducer")]
+ [return: Queue("sample-queue")]
+ public static string ProduceSampleQueueMessage([TimerTrigger("*/10 * * * * *")] TimerInfo timerInfo, ILogger logger)
+ {
+ if (timerInfo.IsPastDue)
+ {
+ logger.LogInformation("Timer is running late!");
+ }
+ var now = DateTime.Now;
+ logger.LogInformation($"C# Timer trigger function executed at: {now}");
+
+ return $"Sample queue message produced at: {now}";
+ }
+
+ ///
+ /// This functions is executed as new messages appear on the queue and consumes them.
+ ///
+ [FunctionName("SampleQueueMessageConsumer")]
+ public static void ConsumeSampleQueueMessage([QueueTrigger("sample-queue")] string message, ILogger logger)
+ {
+ logger.LogInformation("Queue message received: {message}", message);
+ }
+ }
+}
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/host.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/host.json
new file mode 100644
index 000000000000..49b881be321b
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/host.json
@@ -0,0 +1,21 @@
+{
+ "version": "2.0",
+ "logging": {
+ "applicationInsights": {
+ "samplingExcludedTypes": "Request",
+ "samplingSettings": {
+ "isEnabled": true
+ }
+ }
+ },
+ "extensions": {
+ "queues": {
+ "messageEncoding": "none",
+ "maxPollingInterval": "00:00:02",
+ "visibilityTimeout": "00:00:30",
+ "batchSize": 16,
+ "maxDequeueCount": 5,
+ "newBatchThreshold": 8
+ }
+ }
+}
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/local.settings.json b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/local.settings.json
new file mode 100644
index 000000000000..b818866fce36
--- /dev/null
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/functionapp/local.settings.json
@@ -0,0 +1,7 @@
+{
+ "IsEncrypted": false,
+ "Values": {
+ "AzureWebJobsStorage": "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;",
+ "FUNCTIONS_WORKER_RUNTIME": "dotnet"
+ }
+}
\ No newline at end of file
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj
similarity index 56%
rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj
rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj
index 2f520a52c80e..773d4f494c6f 100644
--- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj
@@ -8,7 +8,7 @@
-
-
+
+
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/QueueExtensionSamples.cs b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/QueueExtensionSamples.cs
similarity index 100%
rename from sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/QueueExtensionSamples.cs
rename to sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/samples/readmes/QueueExtensionSamples.cs
diff --git a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln
index 7c50ce4bf5f2..86d6aaa1dbae 100644
--- a/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln
+++ b/sdk/storage/Microsoft.Azure.WebJobs.Extensions.Storage.sln
@@ -32,12 +32,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Ext
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Azure", "..\extensions\Microsoft.Extensions.Azure\src\Microsoft.Extensions.Azure.csproj", "{CB002B93-3D25-42DD-B1A6-472C10B99BA7}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs\samples\Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj", "{77860E78-4770-4C48-8C2B-AF6B42A8D067}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs\samples\readmes\Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Tests.csproj", "{77860E78-4770-4C48-8C2B-AF6B42A8D067}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Queues\samples\Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj", "{A7A937E4-F4E1-47B7-8D25-AA5FB6BDE010}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests", "Microsoft.Azure.WebJobs.Extensions.Storage.Queues\samples\readmes\Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Tests.csproj", "{A7A937E4-F4E1-47B7-8D25-AA5FB6BDE010}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage", "Microsoft.Azure.WebJobs.Extensions.Storage\src\Microsoft.Azure.WebJobs.Extensions.Storage.csproj", "{022028DA-6134-4648-881C-9503E3034995}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App", "Microsoft.Azure.WebJobs.Extensions.Storage.Queues\samples\functionapp\Microsoft.Azure.WebJobs.Extensions.Storage.Queues.Samples.Function.App.csproj", "{342E84D9-3073-4536-A895-0F843782BA97}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App", "Microsoft.Azure.WebJobs.Extensions.Storage.Blobs\samples\functionapp\Microsoft.Azure.WebJobs.Extensions.Storage.Blobs.Samples.Function.App.csproj", "{22D974DB-0B34-48F5-90EC-F65F9902E7D3}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -104,6 +108,14 @@ Global
{022028DA-6134-4648-881C-9503E3034995}.Debug|Any CPU.Build.0 = Debug|Any CPU
{022028DA-6134-4648-881C-9503E3034995}.Release|Any CPU.ActiveCfg = Release|Any CPU
{022028DA-6134-4648-881C-9503E3034995}.Release|Any CPU.Build.0 = Release|Any CPU
+ {342E84D9-3073-4536-A895-0F843782BA97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {342E84D9-3073-4536-A895-0F843782BA97}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {342E84D9-3073-4536-A895-0F843782BA97}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {342E84D9-3073-4536-A895-0F843782BA97}.Release|Any CPU.Build.0 = Release|Any CPU
+ {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {22D974DB-0B34-48F5-90EC-F65F9902E7D3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE