我试图拥有一个事务ID,用于记录整个请求。 Trasaction ID是AuditContext中的一个属性,而每个请求都是一个单例。我在Global.asax.cs
中有以下代码<html>
<head>
<title>Text</title>
</head>
<body>
<div id="uname">
//username related code
<a href="#password"><div id="hello">Next</div></a>
</div>
<div id="password" style="display:none">
//username related code
<div id="final">Submit</div>
</div>
<script>
window.onload=function(){
window.addEventListener("hashchange", function(){ //this is the trick
console.log("Hash changed to", window.location.hash);
if(window.location.hash=="password")
//show password related div
else
//show username related div
});
}
</script>
</body>
交易ID在基础api类中设置。
builder.RegisterType<AuditContext>().As<IAuditContext>().InstancePerRequest();
....
GlobalContainer = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(GlobalContainer);
在下面的构造函数注入用法中注入具有正确事务ID的AuditContext对象。
public BaseApiController(IAuditContext auditContext, IDispatcher dispatcher = null)
{
auditContext.TransactionID = Guid.NewGuid().ToString();
}
如果有任何异常,我想检索事务ID并记录它。但是当我尝试手动解析时,我得到一个新的AuditContext对象,其中事务ID为空。
public class SapEventLogger : ISapEventLogger
{
private IAuditContext auditContext;
public SapEventLogger(IAuditContext auditContext)
{
this.auditContext = auditContext; //this auditContext object has correct transaction ID
}
}
在手动解析AuditContext时,不确定为什么会创建新对象。我错过了什么吗?
答案 0 :(得分:0)
通过BeginLifetimeScope
来电,您需要手动创建第二请求生命周期,而不是使用现有的请求生命周期。两个请求生存期等于两个实例。
The solution to this is outlined in the Autofac docs in more detail但是短版本是从处理程序上下文中的请求消息中获取请求生命周期:
// Get the request lifetime scope so you can resolve services.
var requestScope = context.Request.GetDependencyScope();
// Resolve the service you want to use.
var auditContext = requestScope.GetService(typeof(IAuditContext)) as IAuditContext;
// Do the rest of the work in the filter.
auditContext.DoWork();