Недопустимое сообщение о сбое SOAP только в моно - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать службу ONVIF WSDL в приложении C # .net для связи с камерами IP-видеонаблюдения.

При разработке в .NET Visual Studio в Windows приложение работает нормально из моей командной строки.Попытка запустить тот же .exe на Mono (компилятор Mono JIT версии 5.16.0.220 (tarball Mon Nov 26 17:15:30 UTC 2018) на Debian. Я не могу заставить приложение работать.

Я считаю, что проблемасвязано с тем, что в Mono я получаю плохо отформатированный сбой SOAP, который приложение не может обработать. Я не знаю, вызван ли сбой SOAP IP-камерой, и Mono не может обработать его должным образом (в этом случае у меня возникает ошибкав обработке ошибок и исправлении основной причины, что бы это ни было, это исправило бы это) ИЛИ если сторона SOAP на самом деле в порядке, но Mono только испортил декодирование моих ответов.

Ниже приведена ошибка,похоже, что ответ SOAP содержит «env: faultcode», который не ожидается.

Unhandled Exception:
System.ServiceModel.CommunicationException: Received an invalid SOAP Fault message ---> System.Xml.XmlException: Unexpected node Element name env:faultcode
  at System.ServiceModel.Channels.MessageFault.CreateFault12 (System.ServiceModel.Channels.Message message, System.Int32 maxBufferSize) [0x0012c] in <90242c243a054a8a8feb6f7b52756571>:0 
  at System.ServiceModel.Channels.MessageFault.CreateFault (System.ServiceModel.Channels.Message message, System.Int32 maxBufferSize) [0x0001c] in <90242c243a054a8a8feb6f7b52756571>:0 
   --- End of inner exception stack trace ---
  at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_remoting_wrapper(intptr,intptr)
  at (wrapper remoting-invoke) OnvifMonitor.OnvifDeviceMgmt.Device.GetDeviceInformation(OnvifMonitor.OnvifDeviceMgmt.GetDeviceInformationRequest)
  at OnvifMonitor.OnvifDeviceMgmt.DeviceClient.GetDeviceInformation (OnvifMonitor.OnvifDeviceMgmt.GetDeviceInformationRequest request) [0x00007] in <596fa5448c77457ba1f773bf27dbbf2a>:0 
  at OnvifMonitor.MonitoringThread.Connect (System.String ip, System.Int32 port) [0x0013e] in <596fa5448c77457ba1f773bf27dbbf2a>:0 
  at OnvifMonitor.Program.Main (System.String[] args) [0x0000c] in <596fa5448c77457ba1f773bf27dbbf2a>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.ServiceModel.CommunicationException: Received an invalid SOAP Fault message ---> System.Xml.XmlException: Unexpected node Element name env:faultcode
  at System.ServiceModel.Channels.MessageFault.CreateFault12 (System.ServiceModel.Channels.Message message, System.Int32 maxBufferSize) [0x0012c] in <90242c243a054a8a8feb6f7b52756571>:0 
  at System.ServiceModel.Channels.MessageFault.CreateFault (System.ServiceModel.Channels.Message message, System.Int32 maxBufferSize) [0x0001c] in <90242c243a054a8a8feb6f7b52756571>:0 
   --- End of inner exception stack trace ---
  at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_remoting_wrapper(intptr,intptr)
  at (wrapper remoting-invoke) OnvifMonitor.OnvifDeviceMgmt.Device.GetDeviceInformation(OnvifMonitor.OnvifDeviceMgmt.GetDeviceInformationRequest)
  at OnvifMonitor.OnvifDeviceMgmt.DeviceClient.GetDeviceInformation (OnvifMonitor.OnvifDeviceMgmt.GetDeviceInformationRequest request) [0x00007] in <596fa5448c77457ba1f773bf27dbbf2a>:0 
  at OnvifMonitor.MonitoringThread.Connect (System.String ip, System.Int32 port) [0x0013e] in <596fa5448c77457ba1f773bf27dbbf2a>:0 
  at OnvifMonitor.Program.Main (System.String[] args) [0x0000c] in <596fa5448c77457ba1f773bf27dbbf2a>:0 

Я не хочу публиковать полный код приложения, так как он довольно длинный и не уверен, какая часть важна.Я использовал Visual Studio для "Добавить ссылку на службу" https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl, которая является пространством имен OnvifDeviceMgmt в приведенном ниже сообщении.

WКогда мое приложение запускается, я делаю простой запрос к GetDeviceInformation, который должен вернуть некоторую общую информацию в приложение.Аутентификация передается, следуя примерам https://github.com/thephez/onvif-interface и используя некоторые рекомендации для этого на основе приведенного здесь кода.

Повторюсь, это работает FINE в Windows, но Mono, похоже, ведет себя по-другому.

Любые идеи о том, как я мог бы далее отладить ошибку Soap?Могу ли я как-то сказать ему игнорировать ошибки Soap и передавать их, или выяснить, в чем причина разницы?

...