2014-12-08 4 views
1

Из-за характера устаревшего кода нам нужен один DCOM-сервер для каждого клиента (много статических и глобальных данных в код сервера).Как получить один сервер DCOM на одного клиента

Мы использовали библиотеку Enterprise Services .NET для достижения базовой реализации.

Прежде чем мы сможем исправить ошибку (что означает месяцы + работы), мы хотели бы иметь пригодную для использования систему для примерно 20 пользователей, что означает один сервер на одного клиента.

Возможно ли это с помощью .NET, C# и DCOM?

EDIT: (Дополнительная техническая информация) Клиент является потоком \ сеансом в процессе IIS Hosted. У нас есть веб-api, который регистрируется на нашем сервере, получает некоторые данные и выходит из системы.

+0

Что вы имеете в виду под «DCOM сервера на клиента» в данном контексте? Ваш пост лишен технических подробностей. Обычно с любой клиент-серверной системой один сервер используется несколькими клиентами, а DCOM поддерживает этот сценарий без каких-либо проблем. – Dai

+0

Мне нужен один сервер на одного клиента - не уверен, как сделать его проще. Какие технические детали отсутствуют? –

+0

Самым простым способом является * не * использование библиотеки Enterprise Services. Просто простая DLL, которая работает как сервер в процессе. Таким образом, автоматически создается только один экземпляр сервера для каждого клиента. –

ответ

1

Вы можете использовать COM + Application Pooling для этого. Наследуйте свое обслуживание от ServicedComponent и установите активацию приложения на ActivationOption.Server с использованием атрибута ApplicationActivation.

Вы должны были бы установить сборку в 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; 
     } 
    } 
} 
+0

Похоже, что ключом был Активационный лимит. Спасибо. –