У меня есть проект WebAPI, который использует Entity Framework, и ниже приведены SaveChanges, которые я переопределяю для отслеживания метки времени и т. Д. Мне интересно, почему, когда я переместил AddAuditCustomField в дочерний метод, HttpContext стал нулевым.Я использую Audit.NET AuditDbContext.
public override async Task<int> SaveChangesAsync()
{
AddAuditCustomField("url_endpoint",HttpContextHelper.GetUriEndpoint());
return await SaveChangesAsync(true);
}
public async Task<int> SaveChangesAsync(bool invokeEvent)
{
try
{
//Placing here will be NULL
//AddAuditCustomField("url_endpoint",HttpContextHelper.GetUriEndpoint());
return await SaveChangesAsync(true);
if (invokeEvent)
OnItemSaveChanges?.Invoke();
AddTimestamps();
return await base.SaveChangesAsync();
}
catch (DbEntityValidationException e)
{
throw;
}
}
Ниже приведен HttpContextHelper
namespace Test.Core.Helpers
{
public class HttpContextHelper
{
public static string GetUriEndpoint()
{
if (HttpContext.Current != null) return HttpContext.Current.Request.Url.AbsoluteUri;
if (WebOperationContext.Current != null)
return WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.OriginalString;
if( HttpContextProvider.Current!=null) return HttpContextProvider.Current.Request.Url.AbsoluteUri;
return null;
}
}
}
Контроллер, которым я его называю
var entity = new Entity
{
Name = "test"
};
Db.Entities.Add(entity);
try
{
await Db.SaveChangesAsync();
}
catch (Exception e)
{
if (e.IsDuplicateIndexError())
{
LogUtil.Error(message);
}
throw;
}
Читалкакой-то другой поток, и они заявили, что он работает Использование HttpContext.Current в WebApi опасно из-за асинхронности
И я нацеливаюсь на 4.7.1