ArgumentNullException во время удаленного взаимодействия приложения - PullRequest
3 голосов
/ 27 февраля 2010

У меня есть приложение .NET, которое использует Remoting между Консолью администрирования и приложением Сервера.

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

Я добавил Спонсора в клиент, чтобы предотвратить закрытие соединения Remoting, и убедился, что вызывается метод Renew ().

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

Значение не может быть нулевым. Имя параметра: returnHeaders

Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.ArgumentNullException: значение не может быть нулевым.

Имя параметра: returnHeaders

Ошибка источника:

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

Трассировка стека:

[ArgumentNullException: значение не может быть нулевым.

Имя параметра: returnHeaders]

System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) + 7596735

1 Ответ

3 голосов
/ 27 февраля 2010

Ну, посмотрев на Общий источник, найденный на syncfusion.com , и проверив атрибут SecurityPermissions здесь , и я могу догадаться, что либо BinaryFormatter (вы не сказали что?) не удалось десериализовать рассматриваемый объект.

Поскольку вы упомянули, что это особенно длинный вызов, может быть, стоит обернуть удаленный вызов в блок try / catch и заключить полный стек, чтобы точно определить, где он выходит из строя. Даже лучше, если InnerException не равен NULL, включите это .... Или сделайте что-то вроде этого ... Хорошо, это может звучать хакерски ... и может не получиться ...

На стороне сервера создайте фиктивный метод ... например

void FuBar(void){ 
   int foo = 3, bar = 4, baz = 0; 
   baz = foo + bar; 
}

Когда вы вызываете длительную процедуру, порождайте поток в фоновом режиме для повторного вызова метода FuBar, чтобы убедиться, что сервер удаленного взаимодействия не истекает, а когда вызов завершается, завершите работу потока ...

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

Или это может быть время ожидания сокета? У меня нет идей ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...