interface - SAP .NET 连接器 : System exception thrown while marshaling . NET 类型

标签 interface marshalling sap saprfc sap-dotnet-connector

我的应用向 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)

奇怪的是,这并不是每次都会发生。此外,它提示的 .NET 类型“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 版本并不重要。异常似乎来自托管代码。我能想到的选项是:

  • 尝试在单线程版本上使用调试器。
  • 神奇的方式。即使没有找到错误(那是在 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里面有没有免费的note,所以发到你的邮箱了。

更新 1:SAP 说明 1000057 指出:

Under multithreaded heavy load, exceptions of type RfcMarshalException with reference to System.Xml.Xsl.XsltException as inner exception may occur.

虽然不完全是您收到的异常。值得一试。

补丁作为本说明的附件提供。

**更新 0:**只是猜测。但我建议看看线程问题。这是所有的堆栈吗?你能把调用 sap 代码的部分贴出来吗?

关于interface - SAP .NET 连接器 : System exception thrown while marshaling . NET 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/381760/

相关文章:

c# - 实例化泛型类时如何避免指定冗余类型

angular - 尝试在带有 IWindow 接口(interface)的 Angular2 中使用 speechSynthesis

python - XML-RPC - 无法编码递归字典

.net - SAP 与 Xamarin 集成?

java - 当多个重载合法时调用哪个方法?

syntax - Go 语法和接口(interface)作为函数的参数

java - Jersey 将数字转换为字符串

android.os.BadParcelableException : ClassNotFoundException when unmarshalling: exception

.net - 在没有 Biztalk Server 的情况下使用 Biztalk SAP Adapter 连接 .NET 和 SAP

sap - 地址已在使用 : JVM_Bind when deploying to localhost