我们有多个 WCF 服务都使用 InstanceContextMode=PerCall 并且所有 WCF 服务实例都是通过使用 Unity (IOC) 和实现 IInstanceProvider 生成的。
相关标识符用于审计具有相同标识符的所有方法调用和数据库进程。
为了实现这一点,通过实现 IDispatchBehavior 来创建端点行为,并在 AfterReceiveRequest 方法中生成 guid 并将其分配给 ThreadStatic ( CommonData
) 属性。此属性可以在应用程序的所有层中访问。以下代码块显示了 CommonData 的填充和 CommonData 类;
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
CommonData.ClearDictionary();
//the lines between are deleted as they are not relevant to the question
CommonData.Current.Add(MessageHeaderCodes.CorrelationId, Guid.NewGuid().ToString());
return null;
}
和 commondata 类:
public class CommonData
{
[ThreadStatic]
private static Dictionary<string, string> headerData;
public static Dictionary<string, string> Current
{
get
{
if (headerData == null)
{
headerData = new Dictionary<string, string>();
}
return headerData;
}
}
private CommonData()
{
}
public static string GetHeader(string header)
{
string headerValue = string.Empty;
KeyValuePair<string, string> headerKeyValuePair = CommonData.Current.SingleOrDefault(p => p.Key == header);
headerValue = headerKeyValuePair.Value;
return headerValue;
}
public static void ClearDictionary()
{
Current.Clear();
}
}
这里的问题如下;在某些服务中,开发人员报告相关标识符返回 null。由于问题是间歇性的,目前不可能有完整的堆栈跟踪。此外,他们表示重置 IIS 可以暂时解决此问题。
任何帮助表示赞赏...