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