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

C# 如何为每个客户端获取一台DCOM服务器,c#,.net,dcom,C#,.net,Dcom,由于遗留代码的性质,我们需要每个客户机一台DCOM服务器(服务器代码中有大量静态和全局数据) 我们利用Enterprise Services.NET库实现了一个基本的实现 在我们能够正确地修复它之前(这意味着几个月的工作),我们希望有一个可供20个左右用户使用的系统,这意味着每个客户机一台服务器 对于.NET、C#和DCOM,这一切都是可能的吗 编辑:(更多技术信息) 客户端是IIS托管进程中的线程\会话。我们有一个web api,它可以登录到我们的服务器,获取一些数据并注销。是的,您可以在.N

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

我们利用Enterprise Services.NET库实现了一个基本的实现

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

对于.NET、C#和DCOM,这一切都是可能的吗

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

是的,您可以在.NET中托管COM服务。请查看您可以使用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;
        }
    }
}

在此上下文中,“每个客户端的DCOM服务器”是什么意思?你的帖子没有技术细节。通常在任何客户机/服务器系统中,一台服务器由多个客户机共享,DCOM支持这种情况,没有任何问题。我希望每个客户机有一台服务器-不知道如何使其更简单。缺少什么技术细节?到目前为止,最简单的方法是不使用企业服务库。只是一个作为进程内服务器运行的简单DLL。因此,每个客户端自动只有一个服务器实例。如果您投票反对-您能否提供原因。因此,对于每个传入的web api调用,您希望创建一个承载COM对象的新进程,从web api方法实现中调用对象上的几个方法,然后在web api方法将数据返回给调用方后让进程退出?对吗?看起来激活限制是关键。非常感谢。