C# 环境上下文作用域WCF实例提供程序

C# 环境上下文作用域WCF实例提供程序,c#,wcf,C#,Wcf,我打算在我的项目中使用环境上下文范围,这将在下面介绍。 我是一个客户端/服务器应用程序,客户端通过WCF服务连接。 现在的问题是如何实现WCF实例提供程序。 我尝试的方法总是在应该释放上下文时收到错误消息“System.InvalidOperationException:DbContextScope实例必须按照创建顺序进行释放!” 有人有办法解决这个问题吗 我的实例提供程序的代码被截断: public class MyInstanceProvider<T> : IInstancePr

我打算在我的项目中使用环境上下文范围,这将在下面介绍。 我是一个客户端/服务器应用程序,客户端通过WCF服务连接。 现在的问题是如何实现WCF实例提供程序。 我尝试的方法总是在应该释放上下文时收到错误消息“System.InvalidOperationException:DbContextScope实例必须按照创建顺序进行释放!”

有人有办法解决这个问题吗

我的实例提供程序的代码被截断:

public class MyInstanceProvider<T> : IInstanceProvider, IContractBehavior where T : class
{
    DbContextScopeFactory _dbContextScopeFactory;
    Dictionary<int, IDbContextScope> _Contexts = new Dictionary<int, IDbContextScope>();

    public MyInstanceProvider( DbContextScopeFactory dbContextScopeFactory )
    {
        _dbContextScopeFactory = dbContextScopeFactory;
    }

    public object GetInstance( InstanceContext instanceContext )
    {
        IDbContextScope contextScope = _dbContextScopeFactory.Create();
        _Contexts[instanceContext.GetHashCode()] = contextScope;
        var _Repository = new RepositoryFactory<T>().GetInstance();

        return _Repository;
    }

    public object GetInstance( InstanceContext instanceContext, Message message )
    {
        return GetInstance( instanceContext );
    }

    public void ReleaseInstance( InstanceContext instanceContext, object instance )
    {
        var hashCode = instanceContext.GetHashCode();
        if (_Contexts.ContainsKey( hashCode ))
        {
            var contextScope = _Contexts[hashCode];
            contextScope.Dispose();
            _Contexts.Clear();
        }
    }
公共类MyInstanceProvider:IInstanceProvider,IContractBehavior其中T:class
{
DbContextScopeFactory\u DbContextScopeFactory;
字典_Contexts=新字典();
公共MyInstanceProvider(DbContextScopeFactory DbContextScopeFactory)
{
_dbContextScopeFactory=dbContextScopeFactory;
}
公共对象GetInstance(InstanceContext InstanceContext)
{
IDbContextScope contextScope=_dbContextScopeFactory.Create();
_上下文[instanceContext.GetHashCode()]=contextScope;
var_Repository=new RepositoryFactory().GetInstance();
返回存储库;
}
公共对象GetInstance(InstanceContext InstanceContext,消息)
{
返回GetInstance(instanceContext);
}
public void ReleaseInstance(InstanceContext InstanceContext,对象实例)
{
var hashCode=instanceContext.GetHashCode();
if(_Contexts.ContainsKey(hashCode))
{
var contextScope=_Contexts[hashCode];
contextScope.Dispose();
_上下文。清除();
}
}

您的代码中有三个潜在问题

  • 使用
    instanceContext.GetHashCode()
    作为字典键是不好的-哈希代码不能保证是唯一的。只需使用
    instanceContext
    本身即可

  • ReleaseInstance
    方法中,检查字典是否有正确的键,处理
    contextScope
    ,然后清理整个字典(
    \u Contexts.Clear()
    )。我认为应该将
    \u Contexts.Clear()
    替换为
    \u Contexts.Remove>

  • 您可以使用常用的
    字典
    ,而WCF可以在多个线程中执行您的代码。最好使用
    ConcurrentDictionary


  • 1.尝试使用GetHashCode()获取引用上下文范围对象的唯一键。进行了一些测试,它似乎是唯一的。我的第一次尝试是以相同的结果存储上下文范围对象本身。2+3。您是对的,但这不是问题所在。然后,您遇到的是
    DbContextScope
    的详细信息。消息说您无法创建scope1和scope2,然后按相同的顺序处理它们:scope1和scope2。您使用的是知名的DbContextScope还是定制的?谢谢回答。希望找到熟悉“Mehdi Ambient ContextScope”的人这可以给我一个提示。环境作用域只是意味着它将自己放入当前的
    CallContext
    。异常意味着你实际上拥有嵌套的上下文,即代码在当前的
    CallContext
    中创建了一个新的DbScopeContext。你的WCF服务是如何设计的(回调、呼叫自身等)哪种可能导致呼叫相同的服务?