【问题标题】:Hold COM-reference in .net web service在 .net Web 服务中保存 COM 引用
【发布时间】:2009-04-01 06:36:59
【问题描述】:

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

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

Start 创建一个 COM 组件,Stop 发布。 GetCurrentState 从 COM 组件中检索信息。

这似乎是一件容易的事,但一天之后它仍然拒绝工作。

我尝试将 COM 引用作为成员变量存储在 C# 对象中。该对象不断地重新创建。 然后我尝试将 COM 引用存储在 Session 对象中。但是,还是有问题。

有人知道应该如何存储应该在 web 服务中保持活动的 COM 引用吗?
/L

【问题讨论】:

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


    【解决方案1】:

    假设您在这里使用的是 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 对象的内容在请求之间保留。您需要注意的一件事是 COM 组件正在使用的线程模型,因为有些可能会导致性能问题,因为它们将调用编组到单个线程上。

    【讨论】:

    • @Mitch:空检查后需要加锁,再次检查空,然后创建新实例。
    【解决方案2】:

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

    另一种方法是让您的 COM 组件 COM+ 可访问:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2011-02-05
      • 2010-09-05
      • 2011-01-23
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多