Web API / WCF如何保持对象活着

时间:2014-09-08 06:17:43

标签: c# wcf asp.net-web-api

我有一个引擎(ABBYY FlexiCapture Engine),我想将它与REST服务(WebAPI或WCF)一起使用。 引擎启动初始化需要30秒。每个请求都太长了。我希望引擎加载服务启动并保持“热身”状态。 如何使用WebAPI或WCF执行此操作? (保持引擎活动的最佳方法是什么)。 PS:抱歉我的英语不好。

- 来自ABBYY示例库

private void ProcessImages()
        {
            trace("Loading FlexiCapture Engine...");
            IEngine engine = LoadEngine();
            try
            {
                string samplesFolder = FceConfig.GetSamplesFolder();

                trace("Creating and configuring the FlexiCapture Processor...");
                IFlexiCaptureProcessor processor = engine.CreateFlexiCaptureProcessor();
                processor.AddDocumentDefinitionFile(samplesFolder + "\\SampleProject\\Templates\\Invoice_eng.fcdot");
                // ....

                trace("Adding images to process...");
                processor.AddImageFile(samplesFolder + "\\SampleImages\\Invoices_1.tif");
                // ....

                trace("Recognizing the images and exporting the results...");

                while (true)
                {
                    // Recognize next document
                    IDocument document = processor.RecognizeNextDocument();
                    // processing recognized document...
                }
            }
            finally
            {
                UnloadEngine(ref engine);
            }
        }

        private IEngine LoadEngine()
        {
            // FlexiCapture Engine can be loaded in three diffrent ways:
            // 1) Directly, as in this sample
            // 2) As an inproc server (using COM infrastructure)
            // 3) As an out-of-proc server in a worker process (using COM infrastructure)

            IEngine engine;
            int hResult = InitializeEngine(FceConfig.GetDeveloperSN(), null, null, out engine);
            Marshal.ThrowExceptionForHR(hResult);
            return engine;
        }

我想要创建引擎。之后,我将创建并配置多个FlexiCapture处理器。 (需要很长时间,我想在服务启动时这样做) 比,当用户添加图像时 - 我将使用其中一个处理器来识别它们。

启动时: 创建引擎 - >创建几个处理器(+配置它们); 在方法调用上: 选择一个免费处理器 - >识别用户图像。

2 个答案:

答案 0 :(得分:3)

也许,您需要实现Engine的静态单例实例并使用上下文

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
public static class EngineContainer
{
    private static Engine _engine { get; set; }
    public static Engine GetEngine 
    {
        get { if (_engine == null) Init(); return _engine; }
    }
}

答案 1 :(得分:-2)

如果您的引擎没有任何用户界面(UI),那么您可以使用带有WCF的Windows服务(自托管)。让Windows服务来处理您的引擎(即活动对象)并通过WCF服务处理用户请求