我试图为持有状态的COM组件创建一个web服务接口。
webservice基本上包含Start,Shutdown和GetCurrentState操作。
开始创建一个COM组件,停止发布。 GetCurrentState从COM组件中检索信息。
这似乎很容易,但过了一天它仍然拒绝工作。
我已经尝试将COM引用存储为C#对象中的成员变量。该对象不断重新创建。 然后我尝试将COM引用存储在Session对象中。但是,仍然存在一些问题。
任何人都知道一个应该如何存储COM引用,它应该在webservices中保持活跃状态?
/ L
答案 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 +可访问: