2008-12-19 10 views
3

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

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) 

Что странно, что этого не происходит каждый раз. Кроме того, тип .NET, на который он жалуется, «20081219» - это данные Я прохожу (дата) - не тип. Я думаю, что тип этого поля RFCTYPE.RFCTYPE_TIME.

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


Update:

В соответствии с просьбой, вот код, который вызывает SAP:

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

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


Update:

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

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


Update:

ответ @Igal Сербана, кажется, работает для меня. Завтра утром я проверю журналы и (надеюсь) награду за награду! Спасибо.


Update:

В соответствии с просьбой, моя версия librfc32.dll является 6403.3.78.4732.

ответ

1

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

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

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: ** Только предположение. Но я бы предложил посмотреть на проблемы с потоками. Это весь стек? Можете ли вы опубликовать часть кода, где вы называете код сока?

+0

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

+0

При запуске одного потока он исчезает. Теперь мне просто нужно выяснить, почему ... –

+0

@Igal Serban: К счастью, это не решило проблему. Я думаю, что вы на правильном пути, хотя, похоже, это происходит в штырях, возможно, во время высокой нагрузки. –

1

Edit:

Я все еще думаю, что это что-то делать с отображением. Я считаю, что тип 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 довольно подробно относится к формату даты его даты & значений.

+0

К сожалению, я исключил проблемы с форматом, потому что это не происходит последовательно. –

+0

Это отладка - хорошая идея в целом, хотя я попробую. –

0

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

Просто догадайтесь, надеюсь, что это поможет.

UPDATE:

Guess нет.

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

+0

Нет, каждый поток имеет свое собственное соединение. Фактически, я изменил его так, чтобы каждый поток создавал и открывал/закрывал соединение каждый раз, когда это необходимо. Это не помогло. –

0

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

+0

К сожалению, я исключил проблемы с форматом, потому что это не происходит последовательно. То есть, он работает и терпит неудачу с теми же данными. –