Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带WCF的Autofac-嵌套寿命问题_C#_Wcf_Autofac - Fatal编程技术网

C# 带WCF的Autofac-嵌套寿命问题

C# 带WCF的Autofac-嵌套寿命问题,c#,wcf,autofac,C#,Wcf,Autofac,我有许多WCF服务设置,angularjs使用这些服务。目前我遇到了一个我正在努力解决的问题。我在调用WCF服务时一直收到以下错误消息。任何关于如何解决问题的建议都将不胜感激。在底部可以找到更详细的错误消息 无法解析实例,也无法从此LifetimeScope创建嵌套的生存期,因为它已被释放 Edit:当我在global.asax Application_BeginReques()中构建容器时,它似乎也能工作,因此不仅仅是应用程序_启动。不知道为什么,但至少这比以前好。。。。然而,我以前经常会遇到

我有许多WCF服务设置,angularjs使用这些服务。目前我遇到了一个我正在努力解决的问题。我在调用WCF服务时一直收到以下错误消息。任何关于如何解决问题的建议都将不胜感激。在底部可以找到更详细的错误消息

无法解析实例,也无法从此LifetimeScope创建嵌套的生存期,因为它已被释放

Edit:当我在global.asax Application_BeginReques()中构建容器时,它似乎也能工作,因此不仅仅是应用程序_启动。不知道为什么,但至少这比以前好。。。。然而,我以前经常会遇到这种错误,所以我不相信这种丑陋的解决方法

这是我的global.asax

        ..
        ..

    protected void Application_Start(object sender, EventArgs e)
    {
        var containerBuilder = new IoC();

        // Register your service implementations.
        containerBuilder.Builder.RegisterType<Konstrukt.SL.Services.GetBudgetData>().Named<object>("GetBudgetDataService");
        containerBuilder.Builder.RegisterType<Konstrukt.SL.Services.GetReferenceData>().Named<object>("GetReferenceDataService");
        containerBuilder.Builder.RegisterType<Konstrukt.SL.Services.UpdateBudgetData>().Named<object>("UpdateBudgetDataService");
        ..
        ..
        containerBuilder.Builder.RegisterType<Konstrukt.SL.Services.DimValue>().Named<object>("DimValueService");
        containerBuilder.Builder.RegisterType<Konstrukt.SL.Services.DisplayNameMapping>().Named<object>("DisplayNameMappingService");
        ..
        ..

        // use only one context object per scope/request
        containerBuilder.Builder.RegisterType<Konstrukt.DAL.KonstruktEntities>().InstancePerLifetimeScope();

        AutofacHostFactory.Container = containerBuilder.Builder.Build();
    }
。。
..
受保护的无效应用程序\u启动(对象发送方,事件参数e)
{
var containerBuilder=new IoC();
//注册您的服务实现。
containerBuilder.Builder.RegisterType().Named(“GetBudgetDataService”);
containerBuilder.Builder.RegisterType().Named(“GetReferenceDataService”);
containerBuilder.Builder.RegisterType().Named(“UpdateBudgetDataService”);
..
..
containerBuilder.Builder.RegisterType()。命名为(“DimValueService”);
containerBuilder.Builder.RegisterType().Named(“DisplayNameMappingService”);
..
..
//每个作用域/请求仅使用一个上下文对象
containerBuilder.Builder.RegisterType().InstancePerLifetimeScope();
AutofacHostFactory.Container=containerBuilder.Builder.Build();
}
这是我的IoC类,它注册了所有接口

public class IoC
{
    private ContainerBuilder _builder;
    public ContainerBuilder Builder 
    {
        get 
        {
            if (_builder == null)
            {
                _builder = new ContainerBuilder();

                _builder.RegisterType<BL.App.App>().As<BL.App.IApp>();
                _builder.RegisterType<BL.AppConfig.AppConfig>().As<BL.AppConfig.IAppConfig>();
                _builder.RegisterType<BL.AppConfig.ComponentSetting>().As<BL.AppConfig.IComponentSetting>();
                _builder.RegisterType<BL.AppConfig.Component>().As<BL.AppConfig.IComponent>();
                _builder.RegisterType<BL.AppConfig.AppSetting>().As<BL.AppConfig.IAppSetting>();
                _builder.RegisterType<BL.AppConfig.AppDataSet>().As<BL.AppConfig.IAppDataSet>();
                _builder.RegisterType<BL.AppConfig.AttributeData>().As<BL.AppConfig.IAttributeData>();
                _builder.RegisterType<BL.AppConfig.Constants>().As<BL.AppConfig.IConstants>();
                ..
                ..
                _builder.RegisterType<BL.DimensionData.DisplayNameMapping>().As<BL.DimensionData.IDisplayNameMapping>();
                ..
                ..
                //DAL registrations, etc
                ..
                ..

            }
            return _builder;
        }
        set { _builder = value; }
    }

}
公共级IoC
{
私人集装箱建造商;
公共集装箱建造商
{
得到
{
如果(_builder==null)
{
_builder=新的ContainerBuilder();
_builder.RegisterType().As();
_builder.RegisterType().As();
_builder.RegisterType().As();
_builder.RegisterType().As();
_builder.RegisterType().As();
_builder.RegisterType().As();
_builder.RegisterType().As();
_builder.RegisterType().As();
..
..
_builder.RegisterType().As();
..
..
//DAL注册等
..
..
}
返回构建器;
}
设置{u builder=value;}
}
}
WCF服务实现示例

public class DimValue : IDimValue
{
    private BL.DimensionData.IDimValue _dimValue;
    public DimValue(ILifetimeScope container, BL.DimensionData.IDimValue dimValue)
    {
        AutofacHostFactory.Container = container;
        _dimValue = dimValue;
    }

    public IList<Shared.Poco.DimValue> GetDimValueList(int budgetId, string dimensionFilterJSON, string userId)
    {
        Dictionary<Shared.Poco.Dimension, List<string>> dimensionFilters = null;
        Shared.Poco.User user = new Shared.Poco.User { UserId = userId };
        IList<Shared.Poco.DimValue> list = new List<Shared.Poco.DimValue>();

        using (var scope = AutofacHostFactory.Container.BeginLifetimeScope())
        {
            dimensionFilters = JsonConvert.DeserializeObject<Dictionary<Shared.Poco.Dimension, List<string>>>(dimensionFilterJSON);

            foreach (KeyValuePair<Shared.Poco.Dimension, List<string>> kvp in dimensionFilters)
            {
                foreach (Shared.Poco.DimValue dv in _dimValue.GetDimValueList(budgetId, kvp.Key, kvp.Value, user))
                {
                    list.Add(dv);
                }
            }
        }
        return list;
    }
}

[ServiceContract]
    public interface IDimValue
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
                    RequestFormat = WebMessageFormat.Json,
                    ResponseFormat = WebMessageFormat.Json,
                    BodyStyle = WebMessageBodyStyle.Bare,
                    UriTemplate = "GetDimValueList?budgetId={budgetId}&dimensionFilterJSON={dimensionFilterJSON}&userId={userId}")]
        IList<Shared.Poco.DimValue> GetDimValueList(int budgetId, string dimensionFilterJSON, string userId);
    }
公共类DimValue:IDimValue
{
私有BL.DimensionData.IDimValue _dimValue;
公共DimValue(ILifetimeScope容器,BL.DimensionData.IDimValue DimValue)
{
AutofacHostFactory.Container=容器;
_dimValue=dimValue;
}
公共IList GetDimValueList(int-budgetId、字符串维度FilterJSON、字符串用户ID)
{
Dictionary-dimensionFilters=null;
Shared.Poco.User User=new Shared.Poco.User{UserId=UserId};
IList list=新列表();
使用(var scope=AutofacHostFactory.Container.BeginLifetimeScope())
{
dimensionFilters=JsonConvert.DeserializeObject(dimensionFilterJSON);
foreach(KeyValuePair kvp in dimensionFilters)
{
foreach(Shared.Poco.DimValue dv在_DimValue.GetDimValueList中(budgetId、kvp.Key、kvp.Value、user))
{
列表。添加(dv);
}
}
}
退货清单;
}
}
[服务合同]
公共接口IDimValue
{
[经营合同]
[WebInvoke(Method=“GET”,
RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json,
BodyStyle=WebMessageBodyStyle.Bare,
UriTemplate=“GetDimValueList?budgetId={budgetId}&dimensionFilterJSON={dimensionFilterJSON}&userId={userId}”)]
IList GetDimValueList(int-budgetId,string-dimensionFilterJSON,string-userId);
}
服务标记

<%@ ServiceHost Language="C#" 
Debug="true" 
Service="DimValueService"
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" 
CodeBehind="DimValue.svc.cs" %>

调用DimValue.svc/GetDimValueList时发生详细错误

服务器在处理请求时遇到错误。异常消息是“无法解析实例,并且无法从此LifetimeScope创建嵌套生存期,因为它已被释放。”。有关详细信息,请参阅服务器日志。异常堆栈跟踪是:在Autofac.Core.life.LifetimeScope.CheckNotDisposed()处的Autofac.Core.life.LifetimeScope.BeginLifetimeScope(对象标记)处的Autofac.Core.life.LifetimeScope.BeginLifetimeScope()处的Autofac.Integration.Wcf.AutoFacinInstanceContext..ctor(ILifetimeScope容器)位于System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance(InstanceContext InstanceContext,消息消息)的Autofac.Integration.Wcf.AutoFacinInstanceProvider.GetInstance(InstanceContext InstanceContext,消息消息)处的System.ServiceModel.InstanceContext.GetServiceInstance(InstanceContext InstanceContext InstanceContext,消息请求)位于System.ServiceModel.Dispatcher.InstanceBehavior.EnsureServiceInstance(MessageRpc&rpc)位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage41(MessageRpc&rpc)位于System.ServiceModel.Dispatcher.ImmutableDispatcheRuntime.ProcessMessage4(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&rpc)上在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc&rpc)在System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc&rpc)在System.ServiceModel.Dispatcher.MessageRpc.Process(布尔等操作