繁体   English   中英

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

[英]Will InstanceContextMode.PerCall in WCF instantiate all static variables/methods?

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

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

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

我的问题是

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

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

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

首先不确定为什么要将所有这些数据放在静态变量中? 看起来像是一个不好的设计。 当您说InstanceContextMode.PerCall 据我了解,每个调用都有一个单独的数据副本,并且每个调用都是唯一的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM