Skip to content

Commit

Permalink
Merge pull request #20 from Ignition-Group-Open-Source-Contrib/jaymin…
Browse files Browse the repository at this point in the history
…/ExceptionMiddlewareImpl

Jaymin/exception middleware impl
  • Loading branch information
simranjeet30691 committed Aug 10, 2023
2 parents 95c55ea + b680e23 commit ca45954
Show file tree
Hide file tree
Showing 10 changed files with 270 additions and 50 deletions.
82 changes: 82 additions & 0 deletions DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 12 in DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'ExceptionMiddleware'

Check warning on line 12 in DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'ExceptionMiddleware'
{
private readonly RequestDelegate _next;
private static readonly ILog _logger = LogManager.GetLogger(typeof(ExceptionMiddleware));
public ExceptionMiddleware(RequestDelegate next)

Check warning on line 16 in DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'ExceptionMiddleware.ExceptionMiddleware(RequestDelegate)'

Check warning on line 16 in DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'ExceptionMiddleware.ExceptionMiddleware(RequestDelegate)'
{
_next = next;
}
public async Task InvokeAsync(HttpContext httpContext)

Check warning on line 20 in DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'ExceptionMiddleware.InvokeAsync(HttpContext)'

Check warning on line 20 in DaprMicroserviceTemplate/Middleware/ExceptionMiddleware.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'ExceptionMiddleware.InvokeAsync(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;
}

}
}
67 changes: 67 additions & 0 deletions DaprMicroserviceTemplate/MyTemplate.vstemplate
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<Name>DaprMicroserviceTemplate</Name>
<Description>Dapr Microservice Template</Description>
<ProjectType>CSharp</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>DaprMicroserviceTemplate</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<CreateInPlace>true</CreateInPlace>
<Icon>__TemplateIcon.png</Icon>
<PreviewImage>__PreviewImage.png</PreviewImage>
</TemplateData>
<TemplateContent>
<Project TargetFileName="DaprMicroserviceTemplate.csproj" File="DaprMicroserviceTemplate.csproj" ReplaceParameters="true">
<Folder Name="Properties" TargetFolderName="Properties">
<ProjectItem ReplaceParameters="true" TargetFileName="launchSettings.json">launchSettings.json</ProjectItem>
</Folder>
<Folder Name="Controllers" TargetFolderName="Controllers">
<ProjectItem ReplaceParameters="true" TargetFileName="WeatherForecastController.cs">WeatherForecastController.cs</ProjectItem>
</Folder>
<Folder Name="Middleware" TargetFolderName="Middleware">
<ProjectItem ReplaceParameters="true" TargetFileName="ExceptionMiddleware.cs">ExceptionMiddleware.cs</ProjectItem>
</Folder>
<Folder Name="deploy" TargetFolderName="deploy">
<ProjectItem ReplaceParameters="true" TargetFileName="data.txt">data.txt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deploy.tt">deploy.tt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deploy.yaml">deploy.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployDev.yaml">deployDev.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployLocal.yaml">deployLocal.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployLocalFromAcr.yaml">deployLocalFromAcr.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployProd.yaml">deployProd.yaml</ProjectItem>
</Folder>
<Folder Name="T4Include" TargetFolderName="T4Include">
<ProjectItem ReplaceParameters="true" TargetFileName="deploy.ttinclude">deploy.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.ttinclude">log4net.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net2.ttinclude">log4net2.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="pipeline.ttinclude">pipeline.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="TemplateFileManager.CS.ttinclude">TemplateFileManager.CS.ttinclude</ProjectItem>
</Folder>
<ProjectItem ReplaceParameters="true" TargetFileName="appsettings.Development.json">appsettings.Development.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="appsettings.json">appsettings.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="azure-pipelines.tt">azure-pipelines.tt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="azure-pipelines.yml">azure-pipelines.yml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="build">build</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Dockerfile">Dockerfile</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="dockerLocal">dockerLocal</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.Development.config">log4net.Development.config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.Production.config">log4net.Production.config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.tt">log4net.tt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.config">log4net.config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="NuGet.Config">NuGet.Config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Program.cs">Program.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Readme.md">Readme.md</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Startup.cs">Startup.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="WeatherForecast.cs">WeatherForecast.cs</ProjectItem>
</Project>
</TemplateContent>
<WizardExtension>
<Assembly>MicroserviceTemplateInstallerVS2022, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=22eb75c2263e562b</Assembly>
<FullClassName>MicroserviceTemplateInstallerVS2022.WizardImplementation</FullClassName>
</WizardExtension>
</VSTemplate>
67 changes: 67 additions & 0 deletions DaprMicroserviceTemplate/MyTemplate.vstemplate.bak
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<VSTemplate Version="3.0.0" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Project">
<TemplateData>
<Name>DaprMicroserviceTemplate</Name>
<Description>Dapr Microservice Template</Description>
<ProjectType>CSharp</ProjectType>
<ProjectSubType>
</ProjectSubType>
<SortOrder>1000</SortOrder>
<CreateNewFolder>true</CreateNewFolder>
<DefaultName>DaprMicroserviceTemplate</DefaultName>
<ProvideDefaultName>true</ProvideDefaultName>
<LocationField>Enabled</LocationField>
<EnableLocationBrowseButton>true</EnableLocationBrowseButton>
<CreateInPlace>true</CreateInPlace>
<Icon>__TemplateIcon.png</Icon>
<PreviewImage>__PreviewImage.png</PreviewImage>
</TemplateData>
<TemplateContent>
<Project TargetFileName="DaprMicroserviceTemplate.csproj" File="DaprMicroserviceTemplate.csproj" ReplaceParameters="true">
<Folder Name="Properties" TargetFolderName="Properties">
<ProjectItem ReplaceParameters="true" TargetFileName="launchSettings.json">launchSettings.json</ProjectItem>
</Folder>
<Folder Name="Controllers" TargetFolderName="Controllers">
<ProjectItem ReplaceParameters="true" TargetFileName="WeatherForecastController.cs">WeatherForecastController.cs</ProjectItem>
</Folder>
<Folder Name="Middleware" TargetFolderName="Middleware">
<ProjectItem ReplaceParameters="true" TargetFileName="ExceptionMiddleware.cs">ExceptionMiddleware.cs</ProjectItem>
</Folder>
<Folder Name="deploy" TargetFolderName="deploy">
<ProjectItem ReplaceParameters="true" TargetFileName="data.txt">data.txt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deploy.tt">deploy.tt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deploy.yaml">deploy.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployDev.yaml">deployDev.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployLocal.yaml">deployLocal.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployLocalFromAcr.yaml">deployLocalFromAcr.yaml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="deployProd.yaml">deployProd.yaml</ProjectItem>
</Folder>
<Folder Name="T4Include" TargetFolderName="T4Include">
<ProjectItem ReplaceParameters="true" TargetFileName="deploy.ttinclude">deploy.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.ttinclude">log4net.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net2.ttinclude">log4net2.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="pipeline.ttinclude">pipeline.ttinclude</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="TemplateFileManager.CS.ttinclude">TemplateFileManager.CS.ttinclude</ProjectItem>
</Folder>
<ProjectItem ReplaceParameters="true" TargetFileName="appsettings.Development.json">appsettings.Development.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="appsettings.json">appsettings.json</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="azure-pipelines.tt">azure-pipelines.tt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="azure-pipelines.yml">azure-pipelines.yml</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="build">build</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Dockerfile">Dockerfile</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="dockerLocal">dockerLocal</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.Development.config">log4net.Development.config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.Production.config">log4net.Production.config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.tt">log4net.tt</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="log4net.config">log4net.config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="NuGet.Config">NuGet.Config</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Program.cs">Program.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Readme.md">Readme.md</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="Startup.cs">Startup.cs</ProjectItem>
<ProjectItem ReplaceParameters="true" TargetFileName="WeatherForecast.cs">WeatherForecast.cs</ProjectItem>
</Project>
</TemplateContent>
<WizardExtension>
<Assembly>TemplateInstaller, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=6a3979b0e36e2e58</Assembly>
<FullClassName>TemplateInstaller.WizardImplementation</FullClassName>
</WizardExtension>
</VSTemplate>
4 changes: 4 additions & 0 deletions DaprMicroserviceTemplate/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.IO;
using System.Reflection;
using AutoWrapper;
using DaprMicroserviceTemplate.Middleware;
#pragma warning disable 1591

namespace DaprMicroserviceTemplate
Expand Down Expand Up @@ -71,6 +72,9 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

app.UseAuthorization();

//Global Exception Middleware
app.UseMiddleware<ExceptionMiddleware>();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
Expand Down
48 changes: 24 additions & 24 deletions DaprMicroserviceTemplate/T4Include/log4net2.ttinclude
Original file line number Diff line number Diff line change
Expand Up @@ -46,35 +46,35 @@ fileTemplateManager.StartNewFile("log4net.Development.config");
fileTemplateManager.StartNewFile("log4net.Production.config");
#>
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">

<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>

<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net.UdpAppender">
<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net.UdpAppender">

<remoteAddress value="graylog.webuildgreatsoftware.co.za" />
<remoteAddress value="graylog.webuildgreatsoftware.co.za" />

<remotePort value="12202" />
<layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net.UdpAppender">
<param name="AdditionalFields" value="app:GelfUdpAppender,version:1.0,Environment:Production,Level:%level,Service:<#= props["service"] #>" />
<param name="Facility" value="RandomPhrases" />
<param name="IncludeLocationInformation" value="true" />
</layout>
</appender>
<remotePort value="12202" />
<layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net.UdpAppender">
<param name="AdditionalFields" value="app:GelfUdpAppender,version:1.0,Environment:Production,Level:%level,Service:<#= props["service"] #>" />
<param name="Facility" value="RandomPhrases" />
<param name="IncludeLocationInformation" value="true" />
</layout>
</appender>

<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="ALL" />
<appender-ref ref="A1" />
<appender-ref ref="GelfUdpAppender" />
</root>
</log4net>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="ALL" />
<appender-ref ref="A1" />
<appender-ref ref="GelfUdpAppender" />
</root>
</log4net>

<#
fileTemplateManager.Process(); // Write the output via VS Automation to the project
Expand Down
Binary file added DaprMicroserviceTemplate/__PreviewImage.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added DaprMicroserviceTemplate/__TemplateIcon.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
50 changes: 25 additions & 25 deletions DaprMicroserviceTemplate/log4net.Production.config
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<!-- A1 is set to be a ConsoleAppender -->
<appender name="A1" type="log4net.Appender.ConsoleAppender">

<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<!-- A1 uses PatternLayout -->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>

<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net.UdpAppender">
<appender name="GelfUdpAppender" type="Gelf4Net.Appender.GelfUdpAppender, Gelf4Net.UdpAppender">

<remoteAddress value="graylog.webuildgreatsoftware.co.za" />
<remoteAddress value="graylog.webuildgreatsoftware.co.za" />

<remotePort value="12202" />
<layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net.UdpAppender">
<param name="AdditionalFields" value="app:GelfUdpAppender,version:1.0,Environment:Production,Level:%level,Service:$daprAppName$" />
<param name="Facility" value="RandomPhrases" />
<param name="IncludeLocationInformation" value="true" />
</layout>
</appender>
<remotePort value="12202" />
<layout type="Gelf4Net.Layout.GelfLayout, Gelf4Net.UdpAppender">
<param name="AdditionalFields" value="app:GelfUdpAppender,version:1.0,Environment:Production,Level:%level,Service:$daprAppName$" />
<param name="Facility" value="RandomPhrases" />
<param name="IncludeLocationInformation" value="true" />
</layout>
</appender>

<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="ALL" />
<appender-ref ref="A1" />
<appender-ref ref="GelfUdpAppender" />
</root>
</log4net>
<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
<level value="ALL" />
<appender-ref ref="A1" />
<appender-ref ref="GelfUdpAppender" />
</root>
</log4net>

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Id="MicroserviceTemplateInstallerVS2022.b2499705-d784-411b-8f50-beac80ca9b22" Version="1.0" Language="en-US" Publisher="Ridwaan Moola" />
<Identity Id="MicroserviceTemplateInstallerVS2022.b2499705-d784-411b-8f50-beac80ca9b22" Version="1.1" Language="en-US" Publisher="Jaymin Modi" />
<DisplayName>Dapr Microservice Template</DisplayName>
<Description xml:space="preserve">A Microservice Template using Dapr.io and Kubernetes - VS2022 </Description>
<MoreInfo>https://github.com/Ignition-Group-Open-Source-Contrib/Dapr-Microservice-Template</MoreInfo>
Expand Down

0 comments on commit ca45954

Please sign in to comment.