Есть метод основной метод:
private async Task<TResult> ExecuteImplementation<TResult>(Func<string, Task<TResult>> awaitableFunction, KeyValuePair<string, object>[] additionalLoggingData = null)
{
TResult result;
var stopwatch = new Stopwatch();
var correlationId = Guid.NewGuid().ToString();
var correlationIdProperty = this.logger.PushCorrelationIdProperty(correlationId);
this.GetControllerActionNames(out var controllerName, out var actionName);
if (additionalLoggingData != null)
{
var loggingDataWithLocalData =
new[]
{
new KeyValuePair<string, object>(ControllerNamePropertyName, controllerName),
new KeyValuePair<string, object>(ActionNamePropertyName, actionName)
}
.Union(additionalLoggingData)
.ToArray();
this.logger.LogInfo(string.Format(StartsExecutingMessageForStringFormat, controllerName, actionName, correlationId), loggingDataWithLocalData);
}
else
{
this.logger.LogInfo(StartsExecutingMessageForParams, controllerName, actionName);
}
try
{
stopwatch.Start();
result = await awaitableFunction(correlationId);
}
catch (Exception exception)
{
this.logger.LogError(exception);
throw;
}
finally
{
stopwatch.Stop();
this.logger.LogInfo(ExecutedMillisecondsMessage, controllerName, actionName, stopwatch.ElapsedMilliseconds);
correlationIdProperty.Dispose();
}
return result;
}
Этот метод используется двумя методами, который потом прокидываются как обертка для контроллеров:
public async Task<TResult> ExecuteControllerAction<TResult>(Func<string, Task<TResult>> awaitableFunction, KeyValuePair<string, object>[] additionalLoggingData = null)
{
var result = await this.ExecuteImplementation(awaitableFunction, additionalLoggingData);
return result;
}
public async Task ExecuteControllerAction(Func<string, Task> awaitableFunction, KeyValuePair<string, object>[] additionalLoggingData = null)
{
await this.ExecuteImplementation(
async (correlationId) =>
{
await awaitableFunction(correlationId);
return (object)null;
});
}
Метод, который вызывается в контрллере:
public async Task ControllerAction(SomeDtoExample dtoRequest)
{
await this.Logger.ExecuteControllerAction(async correlationId =>
{....
Была мысля как-то перенести ExecuteImplementation() как middleware. Уже практически сделал(прокинув в метод парметр HttpContext, делегат и тд и тп), но понял что "картинка не складывается". Так как, в контроллерах бывает используются доп методы, которые и вызывают самый главный ExecuteImplementation метод.
Возможно, есть какой-то способ это прокинуть в одну часть, что бы каждый раз метод(экшн) контроллера не обертывать?