Проблемы с переносом удаленного доступа .Net с Framework 2 на 4

В настоящее время у меня было приложение .Net Remoting, работающее на платформе 2 под IIS. Мне нужно обновить его до Framework 4, чтобы использовать некоторые новые компоненты. Мне удалось все настроить и плавно запустить на Framework 2, но как только я перехожу на Framework 4, я получаю следующее исключение, когда пытаюсь вызвать одну из функций моего удаленного объекта.

The input stream is not a valid binary format. 
The starting contents (in bytes) are: 
53-79-73-74-65-6D-2E-52-75-6E-74-69-6D-65-2E-52-65 ...

Эта ошибка не является реальной ошибкой, она вызвана тем, что удаленный объект генерирует исключение, и IIS переносит исключение в XML, что приводит к отключению BinaryFormatter. См. здесь для получения дополнительной информации об ошибке.

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

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

  • Что могло вызвать исключение, если кроме компиляции с .Net 2 на .Net 4 не изменился код?
  • Как я могу получить полное возвращаемое сообщение об исключении?

Вот код, который получает удаленный объект

Dim clientProvider As BinaryClientFormatterSinkProvider = New BinaryClientFormatterSinkProvider()
Dim serverProvider As BinaryServerFormatterSinkProvider = New BinaryServerFormatterSinkProvider()
serverProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full

tsChannelName = System.Guid.NewGuid().ToString()

Dim props As IDictionary = New Hashtable()
props("port") = 0
props("name") = tsChannelName
props("typeFilterLevel") = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full
props("secure") = True
props("useDefaultCredentials") = True

Dim Channel As HttpChannel = New HttpChannel(props, clientProvider, serverProvider)

ChannelServices.RegisterChannel(Channel, False)

//Get the object on the Server
Dim rtnComm As I_CMQCComm = Activator.GetObject(GetType(I_CMQCComm), server)

//Knock knock
rtnComm.IsAlive() 'Exception is thrown here

Я могу предоставить дополнительную информацию по мере необходимости.


person Alexandre    schedule 29.02.2012    source источник
comment
Вы также скомпилировали свой клиентский код для .Net 4?   -  person L.B    schedule 01.03.2012
comment
Да! Также изменил IIS для работы в ASP.NET 4. Мне удалось увидеть точную ошибку, изменив свой форматировщик на Soap. Я только что решил проблему, опубликую ответ :)   -  person Alexandre    schedule 01.03.2012


Ответы (1)


Все в порядке!

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

По сути, у меня был недоступен сервер, и IIS отправлял обратно HTML, который выбрасывал из средства форматирования.

Как увидеть ошибку:

Dim clientProvider As SoapClientFormatterSinkProvider = New SoapClientFormatterSinkProvider()
Dim serverProvider As SoapServerFormatterSinkProvider = New SoapServerFormatterSinkProvider()

Не забудьте также изменить файл Web.Config.

<channels>
      <channel ref="http" >
         <serverProviders>
             <formatter ref="soap" />
          </serverProviders>
          <clientProviders>
             <formatter ref="soap" />
           </clientProviders>
      </channel>
</channels>

Сервер недоступен из-за ошибки в IIS. Ошибка регистрируется в приложении в средстве просмотра событий (Панель управления -> Администрирование -> Средство просмотра событий).

Моя ошибка была связана с тем, что я изменил файл Machine.config так, чтобы IIS не запускался под пользователем ASP_NET. Однако я не знал, что для каждого фреймворка есть файл. IIS Просто не было пользователя для запуска процесса aspnet_wp.exe, поскольку я отключил пользователя ASP_NET.

Небольшие ошибки, надеюсь, это поможет некоторым людям отладить их .Net Remoting. Он отлично работает под .Net 4!

person Alexandre    schedule 29.02.2012