Согласование двух приложений в разных доменах - PullRequest
4 голосов
/ 05 октября 2011

Как я могу уведомить другое приложение, находящееся в другом домене, о сбое текущего запущенного приложения?другими словами, возможно ли согласовать два разных приложения в отдельном домене?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

Вы можете использовать именованные каналы для этого типа IPC. Для этого загляните в пространство имен System.IO.Pipe s и отличные классы NamedsPipeServerStream & NamedPipeClientStream.

Обратите внимание, что вы можете использовать анонимные каналы только для межпроцессного взаимодействия в пределах одного домена, в то время как вы можете использовать именованные каналы для IPC в отдельных доменах (т. Е. Через ПК в одной интрасети).

1 голос
/ 05 октября 2011

Да, это возможно.Насколько это поддерживается в типах .NET, будет зависеть от того, как вы собираетесь определить «произошел сбой».

В основном приложение мониторинга должно предоставить учетные данные, подходящие для доступа к системе, которая должна быть запущенаотслеживаемое приложение.Это именно то, что нужно сделать, чтобы скопировать файл в / из другого домена, начиная с что-то вроде :

net use \\Fileserver1.domain2.com\IPC$ /user:DOMAIN\USER PASSWORD

или его эквивалента API.

Если выиспользуйте WMI (это очевидный подход, легко перечислить процессы в удаленной системе с запросом для Win32_Process), вы можете предоставить учетные данные (например, с помощью скриптового интерфейса или в.NET ).

0 голосов
/ 05 октября 2011

Вы можете использовать событие AppDomain.UnhandledException, чтобы сообщить другому домену приложения, возможно, через именованный мьютекс. Поскольку они являются общесистемными, вы можете создать файл с именем «MyAppHasCrashed» и немедленно заблокировать его. Когда вы нажимаете необработанное исключение, вы освобождаете мьютекс. С другой стороны, есть поток, который ждет на мьютекс. Поскольку он изначально заблокирован, поток будет сидеть в ожидании. При возникновении исключения поток возобновляется, и вы можете обработать сбой.

Mutex crashed = new Mutex(true, "AppDomain1_Crashed");
...
private void AppDomain_UnhandledException(...)
{
    // do whatever you want to log / alert the user
    // then unlock the mutex
    crashed.ReleaseMutex();
}

Затем на другой стороне:

void CrashWaitThread()
{
    try {
        crashed = Mutex.OpenExisting("AppDomain1_Crashed");
    }
    catch (WaitHandleCannotBeOpenedException)
    {
        // couldn't open the mutex
    }
    crashed.WaitOne();
    // code to handle the crash here.
}

Это что-то вроде хака, но хорошо работает как для междоменных, так и для межпроцессных процессов.

...