WCF中的InstanceContextMode.PerCall是否会实例化所有静态变量/方法?

时间:2016-05-11 15:23:20

标签: c# wcf static

在我的WCF代码中,用户的id和名称存储在静态变量中。它从HttpContext.Current.User.Identity.Name和数据库命中检索。还有其他静态变量来存储连接字符串,日志文件相关的东西等。

最近我发现自己处于竞争状态,当第一个呼叫仍在处理时,来自我的客户端的第二个呼叫设置了用户名。这导致第一次呼叫读取由第二次呼叫更新的用户数据。

为了避免这种情况,我阅读了InstanceContextMode.PerCall以及它如何使静态变量在每个调用中表现得像非静态。

我的问题是

1)如果我使用InstanceContextMode.PerCall,这是否意味着它将实例化所有静态变量和方法?我打算只使用它来获取每个呼叫的新用户数据。但是,我假设这也将为连接字符串静态变量,日志文件和其他静态变量创建一个新实例。它是否正确?它会影响性能(从web.config等再次读取)?

2)有没有办法使用InstanceContextMode.PerCall但是只为与用户数据相关的静态变量创建实例并保留连接字符串相关的静态变量?

3)一旦调用完成,是否必须使用dispose方法(实现IDispose)来处理静态变量?

1 个答案:

答案 0 :(得分:0)

首先不确定为什么在静态变量中包含所有这些数据?这看起来像一个糟糕的设计。当你说InstanceContextMode.PerCall;据我所知,每次通话都有一份单独的数据副本,每次通话都是唯一的。

如果您希望不修改数据,请尝试将其声明为static readonly。最后,你应该选择更好的设计。

相关问题