gpt4 book ai didi

c# - WCF PerCall 共享资源锁问题

转载 作者:太空狗 更新时间:2023-10-29 17:58:14 27 4
gpt4 key购买 nike

我正在编写一项服务,该服务会不断受到来自不同来源的攻击。该服务需要在某些对单个共享资源的调用期间保留数据。在本例中是 XML 文件(我知道这是存储数据的愚蠢选择,但我无法控制该决定)。

所以我希望服务运行在

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

除了这种情况,我不需要 session ,而且我的对象构造函数中的设置代码也很少。但是,静态变量不会在服务的每次调用之间共享(它们来得又快又猛)。所以文件上的静态锁不起作用。我通过艰难的方式学到了这一点:

private string _dataFile;

private static object _lock = new object();

private MusicData Get(string fileName)
{
lock (_lock)
{
using (var stream = File.OpenRead(fileName))
{
var serializer = new XmlSerializer(typeof(MusicData));
return serializer.Deserialize(stream) as MusicData;
}
}
}

private void Put(string fileName, MusicData data)
{
lock (_lock)
{
XmlSerializer x = new XmlSerializer(typeof(MusicData));
using (TextWriter writer = new StreamWriter(fileName))
{
x.Serialize(writer, data);
}
}
}

此时最好的策略是什么?我不想为此将我的 InstanceContextMode 更改为 PerSession,任何类型的数据库解决方案都是不可能的。上面的代码导致了可怕的错误:

The process cannot access the file because it is being used by another process

最佳答案

在您描述的场景中,共享客户端访问单个 XML 文件,您可能需要考虑将 InstanceContextMode.SingleConcurrencyMode.Multiple 结合使用,前提是您的服务是无状态的,线程安全的和可重入的。

使用 InstanceContextMode.SingleConcurrencyMode.Multiple 的 WCF 服务不应对您方案中的任何性能问题负责。

单例服务是最终的共享服务。当服务被配置为单例时,所有客户端都独立于彼此连接到同一个众所周知的实例,而不管它们连接到服务的哪个端点。单例服务永远存在,只有在主机关闭后才会被处理掉。单例只在创建主机时创建一次。

http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

关于c# - WCF PerCall 共享资源锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401391/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com