在WCF服务C#中具有静态上下文,ConcurrencyMode.Single,InstanceContextMode.PerSession的负面影响?

时间:2016-11-02 16:11:06

标签: c# entity-framework wcf

我有一个带有静态数据上下文的WCF服务,但没有并发。它已经存在了一年没有任何问题,但是前几天我们看到了一些奇怪的行为,用户正确地传递了数据,但却收到了意外和不正确的数据。这确实通过了F5,所以我们也在那里查看问题。

在下面使用静态上下文设置每个会话的单个并发会不会有任何负面影响?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)]
public class AgencyUserManagementService : IAgencyUserManagement, IDisposable
{
    private static UserDataContext _dataContext;

    protected static UserDataContext Db
    {
        get { return _dataContext ?? (_dataContext = new UserDataContext()); }
    }
}

public class UserDataContext : DbContext
{
    public UserDataContext()
        : base("Name=UserDataContext")
    {
        Database.SetInitializer<UserDataContext>(null);
    }

    public DbSet<TblAuthor> TblAuthors { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new TblAuthorMap());
    }
}

1 个答案:

答案 0 :(得分:2)

  

对单一并发性是否会产生任何负面影响   会话

您将为配置的服务看到的行为是:

  1. 每个唯一调用者创建的服务实例,
  2. 每个服务实例都会对并发请求进行排队(来自单个调用者)并逐个处理它们。
  3.   

    拥有静态上下文的负面影响

    接下来,在这样的服务中定义的静态变量将由潜在的多个服务实例访问。

    如果您有两个并发用户,则两个用户同时使用单个静态DbContext。

    这很可能会导致一些奇怪的问题,例如您所看到的问题。

    出于这个原因(以及其他人),不建议以在应用程序中使用DbContext的方式使用DbContext。

    您应该为每个服务实例初始化一个新的DbContext,这意味着不再跨调用者共享上下文。 Many IOC containers为WCF会话提供了可能有用的插件。

    来源: