1

WCF サービスを備えた IIS 環境でシングルトンを使用しようとしています。

このリンクの第 6 バージョンの推奨事項に従っています http://csharpindepth.com/articles/general/singleton.aspx

    private static readonly Lazy<VedtaksbehandlingRuleService> lazy = new Lazy<VedtaksbehandlingRuleService>(() => new VedtaksbehandlingRuleService());

    public static VedtaksbehandlingRuleService Instance { get { return lazy.Value; } }

    private VedtaksbehandlingRuleService()
    {
        m_Container = StaticServiceContainer.Instance;
        logger = m_Container.Resolve<ILoggerUtility>();
        InitRuleService();
    }

次を使用して呼び出されます:

VedtaksbehandlingBusObjResponse resp = VedtaksbehandlingRuleService.Instance.BehandleVedtak(req);

このコードを単体テストで試すと、問題なく動作します。

これを IIS に展開すると、最初の呼び出し元に対しては正常に機能し、エラーなしで WCF サービスを数回呼び出すことができます。

ただし、別のクライアントがサービスを呼び出すと、次のテキストで例外が発生します。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Body>
        <s:Fault>
            <s:Code>
                <s:Value>s:Receiver</s:Value>
                <s:Subcode>
                    <s:Value xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</s:Value>
                </s:Subcode>
            </s:Code>
            <s:Reason>
                <s:Text xml:lang="nb-NO">Tjenestekallet vedtaRefusjonskravOgBeregnPensjon feilet</s:Text>
            </s:Reason>
            <s:Detail>
                <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                    <HelpLink i:nil="true" />
                    <InnerException>
                        <HelpLink i:nil="true" />
                        <InnerException i:nil="true" />
                        <Message>Failure to create a Deployment Manager Server Manager  for 'VedtaksbehandlingRuleServiceDManager'</Message>
                        <StackTrace>
                            Server stack trace:     at com.blazesoft.server.deploy.manager.NdDeploymentManager.createDeploymentManagerServerManagers(NdDeploymentManagerConfig config) at
                            com.blazesoft.server.deploy.manager.NdDeploymentManager.configure() at
                            com.blazesoft.server.deploy.manager.NdDeploymentManager.createDeploymentManager  (NdDeploymentManagerConfig deploymentManagerConfig) at
                            XXX.Liv.Pensjon.Forretningstjenester.Regelserver.DManager..ctor(String dManagerConfig) at
                            XXX.Liv.Pensjon.Forretningstjenester.Regelserver.RuleServerFactory.CreateRulesServer[T](String serverConfig, String dmanagerConfig, ILoggerUtility logger) at
                            XXX.Liv.Pensjon.Forretningstjenester.Vedtaksbehandlingstjeneste.VedtaksbehandlingRuleService.CreateRuleServer() at
                            XXX.Liv.Pensjon.Forretningstjenester.Vedtaksbehandlingstjeneste.VedtaksbehandlingRuleService.&lt;.cctor&gt;b__0() at 
                            System.Lazy`1.CreateValue()


                            Exception rethrown at [0]: at
                            com.blazesoft.server.deploy.manager.NdDeploymentManager.createDeploymentManagerServerManagers(NdDeploymentManagerConfig config) at
                            com.blazesoft.server.deploy.manager.NdDeploymentManager.configure() at
                            com.blazesoft.server.deploy.manager.NdDeploymentManager.createDeploymentManager(NdDeploymentManagerConfig deploymentManagerConfig) at
                            XXX.Liv.Pensjon.Forretningstjenester.Regelserver.DManager..ctor(String dManagerConfig) at
                            XXX.Liv.Pensjon.Forretningstjenester.Regelserver.RuleServerFactory.CreateRulesServer[T](String serverConfig, String dmanagerConfig, ILoggerUtility logger) at
                            XXX.Liv.Pensjon.Forretningstjenester.Vedtaksbehandlingstjeneste.VedtaksbehandlingRuleService.CreateRuleServer() at
                            XXX.Liv.Pensjon.Forretningstjenester.Vedtaksbehandlingstjeneste.VedtaksbehandlingRuleService.&lt;.cctor&gt;b__0() at
                            System.Lazy`1.CreateValue() at
                            System.Lazy`1.LazyInitValue() at  
                            XXX.Liv.Pensjon.Forretningstjenester.Vedtaksbehandlingstjeneste.Vedtaksbehandlingstjeneste.vedtaRefusjonskravOgBeregnPensjon(vedtaRefusjonskravOgBeregnPensjonRequest1 request)
                        </StackTrace>
                        <Type>com.blazesoft.server.deploy.manager.NdDeploymentManagerException</Type>
                    </InnerException>
                    <Message>Tjenestekallet vedtaRefusjonskravOgBeregnPensjon feilet</Message>
                    <StackTrace>
                        at    
                        XXX.Liv.Pensjon.Forretningstjenester.Vedtaksbehandlingstjeneste.Vedtaksbehandlingstjeneste.vedtaRefusjonskravOgBeregnPensjon(vedtaRefusjonskravOgBeregnPensjonRequest1 request) at 
                        SyncInvokevedtaRefusjonskravOgBeregnPensjon(Object , Object[] , Object[] ) at
                        System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]&amp; outputs) at
                        System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc) at
                        System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc&amp; rpc) at
                        System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc&amp; rpc) at 
                        System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
                    </StackTrace>
                    <Type>System.Exception</Type>
                </ExceptionDetail>
            </s:Detail>
        </s:Fault>
    </s:Body>
</s:Envelope>

インスタンス化モードを設定していないため、呼び出しごとにする必要があります。サービスは呼び出しごとですが、スタックの下位には、ルール エンジンにアクセスするために使用されるクラスがあり、シングルトンでなければなりません。

この問題の原因を知っている人、またはより良い解決策を持っている人はいますか?

4

2 に答える 2