2015-07-10 2 views
0

Я пытаюсь использовать именованный канал с использованием .net NamedPipeServerStream асинхронно, используя обратные вызовы в powershell.Асинхронные именованные каналы в powershell с использованием обратных вызовов

В настоящее время я использую следующий код:

сторона сервера:

$myCallback = [AsyncCallback]{ 
    "Connected" 
} 

$pipe = New-Object System.IO.Pipes.NamedPipeServerStream("alert", [System.IO.Pipes.PipeDirection]::InOut, 1, [System.IO.Pipes.PipeTransmissionMode]::Message, [System.IO.Pipes.PipeOptions]::Asynchronous) 
$pipe.BeginWaitForConnection($myCallback, "alertCallback") 

сторона клиента:

$pipe = new-object System.IO.Pipes.NamedPipeClientStream("alert"); 
$pipe.Connect(3000); 

$sw = new-object System.IO.StreamWriter($pipe); 
$sw.WriteLine("Test"); 

я вызываю код на стороне сервера первым, который сообщает, что обратный вызов была успешно зарегистрирована

AsyncState          IsCompleted AsyncWaitHandle      CompletedSynchronously 
----------          ----------- ---------------      ---------------------- 
alertCallback           False System.Threading.ManualRese...       False 

Как только клиентский код называется сценарием сервера powershell, исключение не выбрасывается, просто я получаю сообщение об ошибке «Windows Powershell перестало работать». Я не понимаю, почему это происходит, и я не могу получить какое-либо исключение или другую отладочную информацию из сценария, чтобы понять, что происходит не так. Если я попытаюсь сделать то же самое синхронно, все будет работать так, как ожидалось. Буду признателен за любую оказанную помощь.

+0

Что-нибудь в Windows Logs на клиенте? – ojf

+0

К сожалению, нет. Я смотрел в разделе Powershell журнала событий, я вижу записи об исключениях, о которых я знаю, и о них сообщалось в консоли из предыдущих неудачных попыток написания вышеуказанного кода, поэтому я предполагаю, что это подходящее место. – Nitr0UK

+0

Вы можете использовать procdump из sysinternals, чтобы создать файл дампа при возникновении исключения. Что-то вроде 'procdump -ma -e 100 '. После того, как у вас есть сбой, вы можете начать расследование с помощью WinDbg. –

ответ

0
  1. Код Надежды клиента находится внутри задания или в другом сценарии.
  2. Добавить pipeDirection в клиентскую трубу.
  3. Добавить sw.AutoFlush = $true перед записью в поток клиента.
  4. Если он все еще не работает, попробуйте добавить CRLF к сообщению: $sw.WriteLine("Test\r\n");

Надеется, что это помогает.

Смежные вопросы