对操作合同WCF的同步访问

时间:2013-10-17 14:02:32

标签: c# multithreading wcf

我有一个WCF服务,它有一个名为GetEmail的操作合同。 GetEmail从数据库表中提取电子邮件。要求是向个人用户(此服务的消费者)发送唯一的电子邮件内容。这意味着没有两个用户可以处理单个电子邮件内容。但由于WCF服务设计,这已被违反。具体而言,WCF ConcurrencyInstanceContent模式。对不起,我现阶段无法改变服务设计。

问题:是否可以在不更改服务设计或数据库表(锁定)的情况下在电子邮件内容上构建同步访问。理想情况下,调用必须在我的GetEmail操作合同上排队。我读到了IExtensibleObject<T>,但无法将其与我的案例联系起来。

[ErrorBehavior(typeof(ErrorHandler))]
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.PerCall)]
public class EmailRepository : IEmailRepository
    {
        public string GetEmail(Guid IdUser)
        {
            //Logic to retrive one email based on data of receive
        }
    }

2 个答案:

答案 0 :(得分:0)

这是一个简单的方法:

[ErrorBehavior(typeof(ErrorHandler))]
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.PerCall)]
public class EmailRepository : IEmailRepository
{
    private static object _lockOb = new object();
    public string GetEmail(Guid IdUser)
    {
        lock(_lockOb)
        {
            //Logic to retrive one email based on data of receive
        }
    }
}

锁将序列化对电子邮件的访问,因此一次只能处理一次电话。它假设您在检索电子邮件时,将引用移动到锁内的下一封电子邮件中。它还假设这是检索这些电子邮件的唯一方法。任何其他可以检索它们的方法都需要共享相同的锁对象。

答案 1 :(得分:0)

我认为将同步访问的责任放在数据库上是最好的方法。大多数数据库都有交易概念,可以让您实现目标。

引用Wikipedia

  

[Transactions]在同时访问数据库的程序之间提供隔离。