hi
When you deploy the app to iis, the environment is production, you can check whether the correct configuration is used. (appsettings.json
)
In short: hangfire focuses on jobs. It is more powerful and has more features.
Zero does not directly reference the Microsoft.CodeAnalysis.Common
package. Are you referencing it manually?
But since you solved the problem through the upgrade package, I think the problem has nothing to do with Zero. : )
You can try replace the built-in AuditingHelper to debug and check why UserId is null.
public override void PreInitialize()
{
Configuration.ReplaceService<IAuditingHelper, MyAuditingHelper>();
}
public class MyAuditingHelper : IAuditingHelper, ITransientDependency
{
public ILogger Logger { get; set; }
public IAbpSession AbpSession { get; set; }
public IAuditingStore AuditingStore { get; set; }
private readonly IAuditInfoProvider _auditInfoProvider;
private readonly IAuditingConfiguration _configuration;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IAuditSerializer _auditSerializer;
public MyAuditingHelper(
IAuditInfoProvider auditInfoProvider,
IAuditingConfiguration configuration,
IUnitOfWorkManager unitOfWorkManager,
IAuditSerializer auditSerializer)
{
_auditInfoProvider = auditInfoProvider;
_configuration = configuration;
_unitOfWorkManager = unitOfWorkManager;
_auditSerializer = auditSerializer;
AbpSession = NullAbpSession.Instance;
Logger = NullLogger.Instance;
AuditingStore = SimpleLogAuditingStore.Instance;
}
public bool ShouldSaveAudit(MethodInfo methodInfo, bool defaultValue = false)
{
if (!_configuration.IsEnabled)
{
return false;
}
if (!_configuration.IsEnabledForAnonymousUsers && (AbpSession?.UserId == null))
{
return false;
}
if (methodInfo == null)
{
return false;
}
if (!methodInfo.IsPublic)
{
return false;
}
if (methodInfo.IsDefined(typeof(AuditedAttribute), true))
{
return true;
}
if (methodInfo.IsDefined(typeof(DisableAuditingAttribute), true))
{
return false;
}
var classType = methodInfo.DeclaringType;
if (classType != null)
{
if (classType.GetTypeInfo().IsDefined(typeof(AuditedAttribute), true))
{
return true;
}
if (classType.GetTypeInfo().IsDefined(typeof(DisableAuditingAttribute), true))
{
return false;
}
if (_configuration.Selectors.Any(selector => selector.Predicate(classType)))
{
return true;
}
}
return defaultValue;
}
public AuditInfo CreateAuditInfo(Type type, MethodInfo method, object[] arguments)
{
return CreateAuditInfo(type, method, CreateArgumentsDictionary(method, arguments));
}
public AuditInfo CreateAuditInfo(Type type, MethodInfo method, IDictionary<string, object> arguments)
{
var auditInfo = new AuditInfo
{
TenantId = AbpSession.TenantId,
UserId = AbpSession.UserId,
ImpersonatorUserId = AbpSession.ImpersonatorUserId,
ImpersonatorTenantId = AbpSession.ImpersonatorTenantId,
ServiceName = type != null
? type.FullName
: "",
MethodName = method.Name,
Parameters = ConvertArgumentsToJson(arguments),
ExecutionTime = Clock.Now
};
try
{
_auditInfoProvider.Fill(auditInfo);
}
catch (Exception ex)
{
Logger.Warn(ex.ToString(), ex);
}
return auditInfo;
}
public void Save(AuditInfo auditInfo)
{
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress))
{
AuditingStore.Save(auditInfo);
uow.Complete();
}
}
public async Task SaveAsync(AuditInfo auditInfo)
{
using (var uow = _unitOfWorkManager.Begin(TransactionScopeOption.Suppress))
{
await AuditingStore.SaveAsync(auditInfo);
await uow.CompleteAsync();
}
}
private string ConvertArgumentsToJson(IDictionary<string, object> arguments)
{
try
{
if (arguments.IsNullOrEmpty())
{
return "{}";
}
var dictionary = new Dictionary<string, object>();
foreach (var argument in arguments)
{
if (argument.Value != null && _configuration.IgnoredTypes.Any(t => t.IsInstanceOfType(argument.Value)))
{
dictionary[argument.Key] = null;
}
else
{
dictionary[argument.Key] = argument.Value;
}
}
return _auditSerializer.Serialize(dictionary);
}
catch (Exception ex)
{
Logger.Warn(ex.ToString(), ex);
return "{}";
}
}
private static Dictionary<string, object> CreateArgumentsDictionary(MethodInfo method, object[] arguments)
{
var parameters = method.GetParameters();
var dictionary = new Dictionary<string, object>();
for (var i = 0; i < parameters.Length; i++)
{
dictionary[parameters[i].Name] = arguments[i];
}
return dictionary;
}
}
hi
query is IQueryable(TEntity) , I think you can directly join query on it.
var query = _lookup_employeeRepository.GetAll().WhereIf(
!string.IsNullOrWhiteSpace(input.Filter),
e=> e.email != null && e.email.Contains(input.Filter)
);
hi
What is your zero version? net core 2.x or 3.x?
Can you provide the full code to reproduce the problem?
I can't access repositories for those data tables,
Can you explain? You can also use IUserNotificationManager to manage notifications.
https://github.com/aspnetboilerplate/aspnetboilerplate/blob/d185d85586c1fdf69b9c8ab6512a3a6942f4d082/src/Abp/Notifications/IUserNotificationManager.cs#L101-L126
hi
Can you share some auditlogs records? How can we reproduce your problem?
hi
The implementation of abp is relatively simple. If it can meet your needs, you can continue to use it. If you have more needs for jobs management, you can check some features of hangfire...
https://aspnetboilerplate.com/Pages/Documents/Background-Jobs-And-Workers#default-background-job-manager https://www.hangfire.io/