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

时间:2014-12-08 20:31:14

标签: c# .net dcom

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

我们已经使用Enterprise Services .NET库来实现基本实现。

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

.NET,C#和DCOM是否可以实现这一点?

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

2 个答案:

答案 0 :(得分:1)

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

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

然后在mmc.exe中打开“组件服务”管理单元,找到新注册的应用程序,打开“属性”,切换到Pooling&回收选项卡,将池大小设置为某个合理的值,并将激活限制设置为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;
        }
    }
}

答案 1 :(得分:0)

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