#wcf #named-pipes
#wcf #именованные каналы
Вопрос:
Я вызываю метод в прокси-сервере WCF, где привязка называется pipes. На данный момент происходит сбой кода с исключением (связанным с wmi — что делает код), но когда я затем выполняю другой метод в том же прокси-сервере, я получаю эту ошибку:
Произошла ошибка записи в канал: Нераспознанная ошибка 232 (0xe8).
Очевидно, это не сильно помогает. Трассировка стека является:
Трассировка стека сервера: в системе.ServiceModel.Каналы.Потоковое соединение.BeginWrite (буфер Byte [], смещение Int32, размер Int32, логическое значение immediate, время ожидания TimeSpan, обратный вызов AsyncCallback, состояние объекта) в системе.ServiceModel.Каналы.FramingDuplexSessionChannel.SendAsyncResult.WriteCore() в системе.ServiceModel.Каналы.FramingDuplexSessionChannel.SendAsyncResult..ctor (канал FramingDuplexSessionChannel, сообщение Message, тайм-аут TimeSpan, обратный вызов AsyncCallback, состояние объекта) в системе.ServiceModel.Каналы.FramingDuplexSessionChannel.OnBeginSend (сообщение message, тайм-аут TimeSpan, обратный вызов AsyncCallback, состояние объекта) в системе.ServiceModel.Каналы.Выходной канал.Начинается отправка (сообщение message, тайм-аут TimeSpan, обратный вызов AsyncCallback, состояние объекта) в системе.ServiceModel.Диспетчер.DuplexChannelBinder.BeginRequest (сообщение message, тайм-аут TimeSpan, обратный вызов AsyncCallback, состояние объекта) в системе.ServiceModel.Каналы.ServiceChannel.SendAsyncResult.Запуск отправки (логическое значение завершено синхронно) в системе.ServiceModel.Каналы.ServiceChannel.SendAsyncResult.FinishEnsureOpen(результат IAsyncResult, логическое значение завершено синхронно) в системе.ServiceModel.Каналы.ServiceChannel.SendAsyncResult.StartEnsureOpen(логическое значение завершено синхронно) в системе.ServiceModel.Каналы.ServiceChannel.SendAsyncResult.FinishEnsureInteractiveInit (результат IAsyncResult, логическое значение завершено синхронно) в системе.ServiceModel.Каналы.ServiceChannel.SendAsyncResult.Запустите sureinteractiveinit() в системе.ServiceModel.Каналы.ServiceChannel.SendAsyncResult.Begin() в системе.ServiceModel.Каналы.ServiceChannel.BeginCall (строковое действие, логический oneway, операция ProxyOperationRuntime, Object[] ins, TimeSpan timeout, обратный вызов AsyncCallback, объект AsyncState) в системе.ServiceModel.Каналы.ServiceChannel.BeginCall (строковое действие, логический oneway, операция ProxyOperationRuntime, Object[] ins, обратный вызов AsyncCallback, объект AsyncState) в системе.ServiceModel.Каналы.ServiceChannelProxy.InvokeBeginService (вызов метода IMethodCallMessage, операция ProxyOperationRuntime) в системе.ServiceModel.Каналы.ServiceChannelProxy.Вызов (сообщение iMessage)
Повторное создание исключения в [0]: в System.Runtime.Удаленное подключение.Прокси.RealProxy.HandleReturnMessage (iMessage reqMsg, iMessage retMsg) в System.Runtime.Удаленное подключение.Прокси.RealProxy.PrivateInvoke (MessageData amp; msgData, тип Int32) в x.xxx.xxxxx (Путь к строке, обратный вызов AsyncCallback, состояние объекта) в x.xproxy.begininstall (путь к строке, обратный вызов AsyncCallback, состояние объекта) в C:UsersprojectAsyncProxy.cs:line 38 в xxx.MainForm.begininstall (отправитель объекта, EventArgs e) в C:UsersprojectMainForm.cs:line 647 в XPrintV7.MainForm.b__e() в C:UsersGurdipDesktopxprojectMainForm.cs:line 664 в системе.Windows.Формы.Управление.Вызовите marshaledcallbackdo(threadmethod Entry tme) в системе.Windows.Формы.Управление.Вызовите marshaledcallbackhelper (объект obj) в системе.Обработка потоков.ExecutionContext.runTryCode(пользовательские данные объекта) в System.Runtime.Службы компилятора.RuntimeHelpers.Выполните код с гарантией очистки (TryCode code, CleanupCode backoutCode, Object userData) в системе.Обработка потоков.ExecutionContext.RunInternal (ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта) в системе.Обработка потоков.ExecutionContext.Run(ExecutionContext ExecutionContext, обратный вызов ContextCallback, состояние объекта) в системе.Windows.Формы.Управление.Вызовите marshaledcallback (threadmethod Entry tme) в системе.Windows.Формы.Управление.InvokeMarshaledCallbacks()
Какова вероятная причина?
Комментарии:
1. wildermuth.com/2009/09/10/…
2. Спасибо, я попробую это. Но все, что я передаю службе wcf, — это строка (то есть путь к файлу), делегат метода обратного вызова и объект, который является состоянием (для этого я передаю пустую строку), что вряд ли выводит лодку из строя, хотя?
Ответ №1:
В сообщении об ошибке говорится, что ошибка Win32 ERROR_NO_DATA
произошла, когда клиентский стек каналов попытался отправить сообщение службе по именованному каналу. Это трудно диагностировать, кроме того, с помощью предоставленной вами информации, но это, вероятно, указывает на то, что клиентский и серверный концы именованного канала перешли в несогласованные состояния в результате предыдущей ошибки WMI. Возможно, ваш клиентский код неправильно управляет состоянием экземпляра прокси-сервера службы при возникновении исключения WMI.
Вы должны включить подробную трассировку WCF как на стороне клиента, так и на стороне службы, что обеспечит более четкую картину происходящего.
Кроме того, публикация части вашего клиентского кода, чтобы показать, где возникает исключение WMI, и как прокси-сервер службы обрабатывается при обработке исключений, может позволить кому-то более точно ответить на ваш вопрос.