如何为每个客户端获取一个 DCOM 服务器

本文关键字:一个 服务器 DCOM 获取 客户端 | 更新日期: 2023-09-27 18:33:30

由于遗留代码的性质,我们需要每个客户端一个DCOM服务器(服务器代码中有大量静态和全局数据)。

我们利用企业服务 .NET 库来实现基本实现。

在我们正确修复它之前(这意味着几个月+的工作),我们希望有一个可供20个左右用户使用的系统,这意味着每个客户端一台服务器。

这在.NET,C#和DCOM中可能吗?

编辑:(更多技术信息)客户端是 IIS 托管进程中的线程''会话。我们有一个 Web api,它登录到我们的服务器获取一些数据并注销。

如何为每个客户端获取一个 DCOM 服务器

为此可以使用 COM+ 应用程序池。从ServicedComponent继承服务,并使用 ApplicationActivation 属性将应用程序激活设置为ActivationOption.Server

您需要

将程序集安装到 GAC 中,这意味着您需要对其进行签名,并且需要向 regsvcs 注册它.exe

然后在 mmc.exe 中打开"组件服务"管理单元,找到新注册的应用程序,打开"属性",切换到"池和回收"选项卡,将"池大小"设置为某个合理的值,并将"激活限制"设置为 1。此外,设置 COM+ 的过期超时以关闭旧进程。

之后,COM+ 将为要创建的 COM 对象的每个新实例创建一个新进程。

这是我的示例代码:

using System.Diagnostics;
using System.EnterpriseServices;
using System.Runtime.InteropServices;
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControl(false)]
namespace SingleUseServer
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [Guid("6C3295E3-D9C9-40E3-AFBD-1398D4D1E344")]
    public interface IService
    {
        int GetProcessId();
    }
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ProgId("Test.Service")]
    [Guid("6B198197-3E88-4429-883D-A818E4E447D3")]
    public class Service : ServicedComponent, IService
    {
        public int GetProcessId()
        {
            return Process.GetCurrentProcess().Id;
        }
    }
}

是的,您可以在 .NET 中托管 COM 服务,看看 http://msdn.microsoft.com/en-us/library/eaw10et3%28v=vs.110%29.aspx