Соединитель SAP .NET Connector:Системное исключение, возникающее во время маршалинга .Тип СЕТИ

StackOverflow https://stackoverflow.com/questions/381760

Вопрос

Мое приложение отправляет очень много данных в SAP.Для этого он создает объект таблицы SAP и отправляет его.Я получаю эту ошибку несколько регулярно, но ненадежно:

System exception thrown while marshaling .NET type 20081219 to RFCTYPE_BCD
   at SAP.Connector.Rfc.RfcMarshal.NetFieldToRfcField(Object src, RFCTYPE type, Encoding encoding, Byte[] dest, Int32 offset, Int32 len, Int32 charSize, Int32 decimals)
   at SAP.Connector.Rfc.RfcStructureUtil.ToRfcStructure(Object obj, Byte[] dest, Type t, Encoding encoding, Boolean isUnicode, PropertyInfo[] propinfos, RfcStructInfo structInfo)
   at SAP.Connector.Rfc.RfcStructureUtil.GetITabFromList(SAPConnection conn, Object list, Type t, RfcStructInfo structInfo, Int32 itab)
   at SAP.Connector.Rfc.RfcClient.PrepareClientParameters(Type classType, MethodInfo m, Boolean isTQRfc, Object[] MethodParamsIn, RFC_PARAMETER[]& paramsIn, RFC_PARAMETER[]& paramsOut, RFC_TABLE[]& tables, ParameterMap[]& paramMaps)
   at SAP.Connector.Rfc.RfcClient.RfcInvoke(SAPClient proxy, String method, Object[] methodParamsIn)
   at SAP.Connector.SAPClient.SAPInvoke(String method, Object[] methodParamsIn)

Что странно, так это то, что это происходит не каждый раз.Кроме того, .Тип СЕТИ, на который он жалуется, "20081219" - это данные Я передаю (дату) - не типаж.Я думаю, что тип этого поля таков RFCTYPE.RFCTYPE_TIME.

Есть какие-либо предложения по устранению этой прерывистой ошибки?Есть ли какое-то состояние, которое я должен очищать между вызовами SAP RFC?


Обновить:

Как и было запрошено, вот код, который вызывает SAP:

Using sapConnection As New MySapProxy(ConnectionString)
  sapConnection.Connection.Open()
  sapConnection.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
End Using

Я думаю, возможно, несколько потоков каким-то образом используют одно и то же соединение.Используя SAP.Connector.GetNewConnection вместо этого ничего не изменилось.


Обновить:

Кажется, эта проблема возникает даже тогда, когда я запускаю один поток!В чем дело??

Есть ли способ отключить пул подключений, чтобы посмотреть, исправляет ли это проблему?


Обновить:

Ответ @Igal Serban, похоже, работает для меня.Я проверю логи завтра утром и (надеюсь) назначу награду!Большое спасибо.


Обновить:

Как и было запрошено, моя версия librfc32.dll - 6403.3.78.4732.

Это было полезно?

Решение

Обновление 4: С другой стороны, я не думаю, что версия librfc важна.Исключение, по-видимому, исходит из управляемого кода.Варианты, о которых я могу подумать, следующие:

  • Попробуйте использовать debugger в однопоточной версии.
  • Волшебный способ.Даже не обнаружив ошибку (которая находится в sap или вашем коде).Просто изменив способ ведения бизнеса, вы можете избавиться от него.Это некрасиво, но иногда практично.В любом случае, рекомендуемый способ для вашего сценария, по-видимому, заключается в использовании пула соединений, а не в создании нового прокси-объекта для каждого запроса.Таким образом, можно использовать что-то вроде этого (непроверенного) кода:

MySapProxy proxy = new MySapProxy(); // do this only once.

// and in you main loop:
using (proxy.Connection = Connection.GetConnection(connectionString))
{
    proxy.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
}

В этом примере неявно используется пул соединений.Использованием можно управлять из конфигурационного файла.

Обновление 3: Не могли бы вы, пожалуйста, проверить свою версию librfc32.dll и дату?он должен быть в каталоге system32, или в каталоге вашего приложения, или где-нибудь в вашем %path%.

Обновление 2: Заметки Sap - это точно так же, как статьи kb.Я не знаю, есть ли бесплатный доступ к заметке в sdn.sap.com поэтому я отправил ее на вашу почту.

Обновление 1: В SAP Note 1000057 говорится:

При многопоточной интенсивной загрузке могут возникать исключения типа RfcMarshalException со ссылкой на System.Xml.Xsl.XsltException в качестве внутреннего исключения.

Хотя это не совсем то исключение, которое вы получаете.Это стоит попробовать.

Исправление доступно в виде приложения к этой заметке.

** Обновление 0:** Только предположение.Но я бы предложил рассмотреть проблемы с потоками.Это весь стек?Можете ли вы опубликовать ту часть кода, где вы вызываете sap-код?

Другие советы

Редактировать:

Я все еще думаю, что это как-то связано с картографированием.Я полагаю, что тип RFCTYPE_BCD является десятичным (Business Connector Decimal), поэтому ему будет трудно ввести в него значение даты (и, возможно, иногда это сработает?).Я бы предложил повторно использовать прокси-серверы или регистрировать сортируемые данные при получении ошибки.Что-то вроде этого (извините - мы используем наш собственный уровень прокси, поэтому я не очень хорошо знаком с Business Connector):

Не могли бы вы перевести следующее в VB (и независимо от формата структуры sapTable):

Using sapConnection As New MySapProxy(ConnectionString)
  sapConnection.Connection.Open()
  try {
    sapConnection.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
  } catch (Exception e) {
    StringBuilder sb = new StringBuilder();
    foreach (Field f in sapTable.Fields) {
      sb.AppendLine(f.Name + "=" f.Value);
    }
    sb.AppendLine(e.StackTrace);
    File.AppendAllText("C:\\Exception_" + DateTime.Now.ToString("u") + ".txt", sb.ToString());
  }
End Using

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

========

Исходя только из опубликованного вами описания, лучшее, что я могу придумать, это, возможно, вы пытаетесь упорядочить значение даты (20081219) в поле времени?

Можете ли вы обернуть этот вызов в try / catch и записать значения таблицы, отправляемой в SAP, и опубликовать их здесь?Я надеюсь, что в этих данных есть подсказка.

Я знаю, проводя публикации веб-сервиса в SAP, что SAP довольно разборчив в формате своих значений даты и времени.

Похоже, что он пытается преобразовать целое число или строку (не могу сказать из-за toString()) в BCD (двоично-десятичный код) тип.

Просто предположение, надеюсь, это поможет.

Обновить:

Думаю, что нет.

Несколько потоков, использующих одно и то же соединение?Вероятно, это не очень хорошая идея, если только вы не используете блокировку, которая сделает поток бессмысленным.Я уверен, что SAP поддерживает пулы подключений, поэтому откройте соединение в своем собственном потоке (по одному на поток).

Может быть, это проблема с форматом даты?Ты говоришь, что это случается не каждый раз.
Таким образом, когда вы передаете 20081202, он принимает '12' как часть дня и 02 как часть месяца.Все в порядке.
Но когда вы передаете 20081219, он пытается проанализировать 19 как месяц и выдает исключение?
Уточните это у вашего администратора SAP.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top