diff --git a/DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs b/DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs
new file mode 100644
index 0000000..21cdfa7
--- /dev/null
+++ b/DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs
@@ -0,0 +1,82 @@
+using AutoWrapper.Wrappers;
+using log4net;
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+//using LogzLoggerProvider;
+
+namespace DaprMicroserviceTemplate.Middleware
+{
+ public class ExceptionMiddleware
+ {
+ private readonly RequestDelegate _next;
+ private static readonly ILog _logger = LogManager.GetLogger(typeof(ExceptionMiddleware));
+ public ExceptionMiddleware(RequestDelegate next)
+ {
+ _next = next;
+ }
+ public async Task InvokeAsync(HttpContext httpContext)
+ {
+ var requestContent = string.Empty;
+ var request = httpContext?.Request;
+ try
+ {
+ if ((request.Method == HttpMethods.Post || request.Method == HttpMethods.Put) && request.ContentLength > 0)
+ {
+ request.EnableBuffering();
+ var buffer = new byte[Convert.ToInt32(request.ContentLength)];
+ await request.Body.ReadAsync(buffer, 0, buffer.Length);
+ //get body string here...
+ requestContent = Encoding.UTF8.GetString(buffer);
+ request.Body.Position = 0; //rewinding the stream to 0
+ }
+ var requestedData = PrepareRequestedData(httpContext, requestContent);
+
+ //Please uncomment below line and allow for global start logs
+ // _logger.ServiceStarted(list: requestedData);
+
+ await _next(httpContext);
+ }
+ catch (Exception ex)
+ {
+ var requestedData = PrepareRequestedData(httpContext, requestContent);
+ await HandleExceptionAsync(httpContext, ex, requestedData);
+ }
+ }
+ private async Task HandleExceptionAsync(HttpContext context, Exception exception, object[] requestedData)
+ {
+ var path = context.Request?.Path;
+ int statusCode;
+
+ //Please uncomment below line and allow for global exception logs
+ //_logger.ServiceFaulted(exception, path, requestedData);
+
+ switch (true)
+ {
+ case bool _ when exception is ApiException:
+ statusCode = (int)HttpStatusCode.BadRequest;
+ break;
+
+ default:
+ statusCode = (int)HttpStatusCode.InternalServerError;
+ break;
+ }
+ context.Response.StatusCode = statusCode;
+ context.Response.ContentType = "application/json";
+ await context.Response.WriteAsync(exception.GetBaseException().Message);
+ }
+
+ private object[] PrepareRequestedData(HttpContext context, string requestBodyJson)
+ {
+ var request = context?.Request;
+ var requestData = new object[]{
+ request?.Method,
+ requestBodyJson,
+ request?.QueryString};
+ return requestData;
+ }
+
+ }
+}
diff --git a/DaprMicroserviceTemplate/MyTemplate.vstemplate b/DaprMicroserviceTemplate/MyTemplate.vstemplate
new file mode 100644
index 0000000..b0d6a92
--- /dev/null
+++ b/DaprMicroserviceTemplate/MyTemplate.vstemplate
@@ -0,0 +1,67 @@
+
+
+ DaprMicroserviceTemplate
+ Dapr Microservice Template
+ CSharp
+
+
+ 1000
+ true
+ DaprMicroserviceTemplate
+ true
+ Enabled
+ true
+ true
+ __TemplateIcon.png
+ __PreviewImage.png
+
+
+
+
+ launchSettings.json
+
+
+ WeatherForecastController.cs
+
+
+ ExceptionMiddleware.cs
+
+
+ data.txt
+ deploy.tt
+ deploy.yaml
+ deployDev.yaml
+ deployLocal.yaml
+ deployLocalFromAcr.yaml
+ deployProd.yaml
+
+
+ deploy.ttinclude
+ log4net.ttinclude
+ log4net2.ttinclude
+ pipeline.ttinclude
+ TemplateFileManager.CS.ttinclude
+
+ appsettings.Development.json
+ appsettings.json
+ azure-pipelines.tt
+ azure-pipelines.yml
+ build
+ Dockerfile
+ dockerLocal
+ log4net.Development.config
+ log4net.Production.config
+ log4net.tt
+ log4net.config
+ NuGet.Config
+ Program.cs
+ Readme.md
+ Startup.cs
+ WeatherForecast.cs
+
+
+
+ MicroserviceTemplateInstallerVS2022, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=22eb75c2263e562b
+ MicroserviceTemplateInstallerVS2022.WizardImplementation
+
+
\ No newline at end of file
diff --git a/DaprMicroserviceTemplate/MyTemplate.vstemplate.bak b/DaprMicroserviceTemplate/MyTemplate.vstemplate.bak
new file mode 100644
index 0000000..b752d5a
--- /dev/null
+++ b/DaprMicroserviceTemplate/MyTemplate.vstemplate.bak
@@ -0,0 +1,67 @@
+
+
+ DaprMicroserviceTemplate
+ Dapr Microservice Template
+ CSharp
+
+
+ 1000
+ true
+ DaprMicroserviceTemplate
+ true
+ Enabled
+ true
+ true
+ __TemplateIcon.png
+ __PreviewImage.png
+
+
+
+
+ launchSettings.json
+
+
+ WeatherForecastController.cs
+
+
+ ExceptionMiddleware.cs
+
+
+ data.txt
+ deploy.tt
+ deploy.yaml
+ deployDev.yaml
+ deployLocal.yaml
+ deployLocalFromAcr.yaml
+ deployProd.yaml
+
+
+ deploy.ttinclude
+ log4net.ttinclude
+ log4net2.ttinclude
+ pipeline.ttinclude
+ TemplateFileManager.CS.ttinclude
+
+ appsettings.Development.json
+ appsettings.json
+ azure-pipelines.tt
+ azure-pipelines.yml
+ build
+ Dockerfile
+ dockerLocal
+ log4net.Development.config
+ log4net.Production.config
+ log4net.tt
+ log4net.config
+ NuGet.Config
+ Program.cs
+ Readme.md
+ Startup.cs
+ WeatherForecast.cs
+
+
+
+ TemplateInstaller, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=6a3979b0e36e2e58
+ TemplateInstaller.WizardImplementation
+
+
\ No newline at end of file
diff --git a/DaprMicroserviceTemplate/Startup.cs b/DaprMicroserviceTemplate/Startup.cs
index c335b85..575698a 100644
--- a/DaprMicroserviceTemplate/Startup.cs
+++ b/DaprMicroserviceTemplate/Startup.cs
@@ -10,6 +10,7 @@
using System.IO;
using System.Reflection;
using AutoWrapper;
+using DaprMicroserviceTemplate.Middleware;
#pragma warning disable 1591
namespace DaprMicroserviceTemplate
@@ -71,6 +72,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
app.UseAuthorization();
+ //Global Exception Middleware
+ app.UseMiddleware();
+
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
diff --git a/DaprMicroserviceTemplate/T4Include/log4net2.ttinclude b/DaprMicroserviceTemplate/T4Include/log4net2.ttinclude
index b030c60..77be836 100644
--- a/DaprMicroserviceTemplate/T4Include/log4net2.ttinclude
+++ b/DaprMicroserviceTemplate/T4Include/log4net2.ttinclude
@@ -46,35 +46,35 @@ fileTemplateManager.StartNewFile("log4net.Development.config");
fileTemplateManager.StartNewFile("log4net.Production.config");
#>
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
+
-
-
- " />
-
-
-
-
+
+
+ " />
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
<#
fileTemplateManager.Process(); // Write the output via VS Automation to the project
diff --git a/DaprMicroserviceTemplate/__PreviewImage.png b/DaprMicroserviceTemplate/__PreviewImage.png
new file mode 100644
index 0000000..205b53a
Binary files /dev/null and b/DaprMicroserviceTemplate/__PreviewImage.png differ
diff --git a/DaprMicroserviceTemplate/__TemplateIcon.png b/DaprMicroserviceTemplate/__TemplateIcon.png
new file mode 100644
index 0000000..205b53a
Binary files /dev/null and b/DaprMicroserviceTemplate/__TemplateIcon.png differ
diff --git a/DaprMicroserviceTemplate/log4net.Production.config b/DaprMicroserviceTemplate/log4net.Production.config
index 87dc807..6aa760c 100644
--- a/DaprMicroserviceTemplate/log4net.Production.config
+++ b/DaprMicroserviceTemplate/log4net.Production.config
@@ -1,31 +1,31 @@
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/MicroserviceTemplateInstallerVS2022/ProjectTemplates/DaprMicroserviceTemplate.zip b/MicroserviceTemplateInstallerVS2022/ProjectTemplates/DaprMicroserviceTemplate.zip
index 6db28f8..73c8a76 100644
Binary files a/MicroserviceTemplateInstallerVS2022/ProjectTemplates/DaprMicroserviceTemplate.zip and b/MicroserviceTemplateInstallerVS2022/ProjectTemplates/DaprMicroserviceTemplate.zip differ
diff --git a/MicroserviceTemplateInstallerVS2022/source.extension.vsixmanifest b/MicroserviceTemplateInstallerVS2022/source.extension.vsixmanifest
index 2724c63..f86b09f 100644
--- a/MicroserviceTemplateInstallerVS2022/source.extension.vsixmanifest
+++ b/MicroserviceTemplateInstallerVS2022/source.extension.vsixmanifest
@@ -1,7 +1,7 @@
-
+
Dapr Microservice Template
A Microservice Template using Dapr.io and Kubernetes - VS2022
https://github.com/Ignition-Group-Open-Source-Contrib/Dapr-Microservice-Template