在.net Web服务中保持COM引用

时间:2009-03-31 21:54:43

标签: web-services com asp.net-2.0

我试图为持有状态的COM组件创建一个web服务接口。

webservice基本上包含Start,Shutdown和GetCurrentState操作。

开始创建一个COM组件,停止发布。 GetCurrentState从COM组件中检索信息。

这似乎很容易,但过了一天它仍然拒绝工作。

我已经尝试将COM引用存储为C#对象中的成员变量。该对象不断重新创建。 然后我尝试将COM引用存储在Session对象中。但是,仍然存在一些问题。

任何人都知道一个应该如何存储COM引用,它应该在webservices中保持活跃状态​​?
/ L

2 个答案:

答案 0 :(得分:3)

假设您在这里使用ASMX,而不是WCF,在那里您可以稍微改变生活时间,每次请求都会重新创建服务请求的类。这是ASMX的标准行为。

您需要做的是将COM对象存储在Cache []或Application []集合中。当工作池被回收时,它可能仍会被破坏。像这样的一些代码就是你所需要的:

public FooClass GetFooClassInstance()
{
    FooClass instance = (FooClass)this.Context.Application["FooClassInstance"];

    if (instance == null)
    {
        instance = new FooClass(); // Creates the RCW.
        this.Context.Application["FooClassInstance"] = instance;
    }

    return instance;
}

FooClass是COM对象的运行时可调用包装器。 Application请求之间保留Application对象内容。您需要注意的一件事是COM组件正在使用的线程模型,因为它们可能会导致性能问题,因为它们会将调用封送到单个线程上。

答案 1 :(得分:2)

Web服务本质上是无状态的。尝试创建Windows服务并使用Web服务来控制它。 Start方法将启动Windows服务,该服务将实例化COM组件。 GetCurrentState方法将与服务通信并获取COM引用。

另一种方法是使COM组件COM +可访问:

  1. 打开管理工具 - >组件服务。
  2. 打开COM +应用程序节点。
  3. 创建新应用程序。在第一个向导步骤中选择“创建空应用程序”。键入应用程序名称,然后在下一步中选择“服务器应用程序”选项。
  4. 创建新组件。在向导中选择“安装新组件”。找到并选择您的COM dll。
  5. 转到组件属性并启用对象池。将最小和最大池大小设置为1.这将使您的组件成为单个组件。