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

Posted

技术标签:

【中文标题】如何为每个客户端获取一个 DCOM 服务器【英文标题】:How to get one DCOM Server per client 【发布时间】:2014-12-08 20:31:14 【问题描述】:

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

我们利用 Enterprise Services .NET 库来实现基本实现。

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

.NET、C# 和 DCOM 是否可以做到这一点?

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

【问题讨论】:

在这种情况下,“每个客户端的 DCOM 服务器”是什么意思?你的帖子没有技术细节。通常对于任何客户端/服务器系统,单个服务器由多个客户端共享,而 DCOM 支持这种情况没有任何问题。 我希望每个客户端一台服务器 - 不知道如何使它更简单。缺少哪些技术细节? 到目前为止,最简单的方法是使用企业服务库。只是一个作为进程内服务器运行的简单 DLL。因此,每个客户端自动只有一个服务器实例。 如果你投反对票 - 你能提供一个理由吗? 因此,对于 每个 传入的 Web api 调用,您想要创建一个托管您的 COM 对象的 new 进程,在该对象上调用一些方法从您的 web api 方法实现中,然后在 web api 方法将数据返回给调用者后让进程退出?对吗? 【参考方案1】:

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

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

然后打开 mmc.exe 中的 Component Services 管理单元,找到您新注册的应用程序,打开 Properties,切换到 Pooling & Recycling 选项卡,将 Pool Size 设置为某个合理的值并将 Activation Limit 设置为 1。还将 Expiration Timeout 设置为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;
        
    

【讨论】:

看起来激活限制是关键。非常感谢。【参考方案2】:

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

【讨论】:

以上是关于如何为每个客户端获取一个 DCOM 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何为javascript数组中的每个对象动态添加属性

如何为不同的客户端在应用商店中管理相同iOS应用的不同版本

如何为每个 url 配置 grails/spring 身份验证方案?

我们如何为客户获取实时 Instagram 位置通知?

如何为 keycloak 客户端秘密 REST 调用获取未混淆的客户端秘密

如何为收据表中的每个客户找到最后支付的账单