使用ERPConnect连接到SAP时出现随机错误
我们在我们的ASP.NET应用程序中使用ERPConnect,但有时当用户尝试通过我们的应用程序连接到SAP时,我们会收到一些错误消息。使用ERPConnect连接到SAP时出现随机错误
CPIC-CALL:“CMRCV:RC = 19 LOCATION SAP-网关主机SERVERNAME/sapgw10 ERROR会话53230591未找到TIME星期三11月16 13时49分58秒2011 RELEASE 701 COMPONENT SAP-网关VERSION 2 RC 728 MODULE gwxxrd.c LINE 6278 COUNTER 1277701
当通过ERPConnect打开到SAP的连接时,总会发生这种情况。
R3Connection connection = Connection;
connection.Open(); // the error occurs here
这是非常随机的。有些日子我们没有收到任何错误信息,其他日子我们每天收到20封邮件。 ERPConnect使用System32文件夹中定义的librfc32.dll,并具有版本7200.1.39.6461(这是最新版本)。
我的本地开发机器(Windows 7 x86)上未出现此问题。它始终发生在我们的生产服务器(Windows Server 2008 R2)上。
任何想法可能会导致此问题?
编辑(添加错误日志提取物):
* * LOCATION SAP-Gateway on host HERCULES/sapgw10 * ERROR partner 'hercules:sapgw01' not reached * * TIME Thu Nov 24 09:10:20 2011 * RELEASE 701 * COMPONENT NI (network interface) * VERSION 38 * RC -10 * MODULE nixxi.cpp * LINE 2835 * DETAIL NiPConnect2 * SYSTEM CALL connect * ERRNO 10061 * ERRNO TEXT WSAECONNREFUSED: Connection refused * COUNTER 1385122 * *****************************************************************************
GwTraceHdlInfo:
HANDLE = 137
TIME = Thu Nov 24 09:10:19 2011
SOCKET = 2108
STAT = NI_CONN_WAIT
TYPE = STREAM IPv4
OUT = 0 messages 0 bytes
IN = 0 messages 0 bytes
LOCAL = 0.0.0.0:1865
REMOTE = -
OPTIONS = BUFFERED
ni hdl = 137
type = CLIENT
net_stat = CONNECT_TO_REM_GW_PENDING
hostaddr = 100.100.103.15
accept_hostaddr = 100.100.103.15
opcode = NORMAL_CLIENT
conn opcode = REMOTE_GATEWAY
conn vers = 2
index = 10
data = 0000000000000000
ext_info = 000000000EF1D870
offset = 0
rest_len = 0
snc_forced = 0
remote gateway infos:
hostname =
hostaddr = 100.100.103.15
service = sapgw01
tpname = sapdp01
GwSelClear: clear RWC for hdl 137
NiICloseHandle: called for hdl 137 while waiting for connection
NiICloseHandle: shutdown and close hdl 137/sock 2108
GwFreeHdlInfoMemory: free 000000000EF1D870 (ext info)
GwIFreeMemForLU_TP: freed memory for sys 10
GwListRemove: remove elem 10 from sys_r3_list
GwListRemove: 2 elems in sys_r3_list
GwListRemove: elem 10 not in sys_reg_list
GwListRemove: remove elem 10 from sys_inuse_list
GwListRemove: 104 elems in sys_inuse_list
GwUpdateClient: act_sys: 104
GwIDelR3Conn: send error message to client
GwSendRc3: send (appc_rc=CM_PRODUCT_SPECIFIC_ERROR/sap_rc=GW_CONNECT_FAILED) to client HERCULES/sapgw10 (0)
GwRqDpSendTo: (HERCULES/sapgw10, gw_id=0, appc_ca_blk=-1, len=335, comm_index=-1)
LOCK APPC ca_blk 3
DpGetCpicCommIdx: found index 3 via appc_hdr
found comm entry 3 (tid/uid/mode/conv_id/a_r: 158/13268/0/ /0)
GwIsAWaitingSWP: wp 1 waiting
GwSapWpWakeUp: send answer to sap wp 1
GwSapWpWakeUp: make wp 1 owner of appc_ca_blk 3
-OUT- tid -1 uid -1 mode 255
-OUT- appc_ca_blk 3 len 335 rq_id 43133
-OUT- wait_f_answ 0 cmd 0
NiIWrite: hdl 109 sent data (wrt=28,pac=1,MESG_IO)
GwIDelR3Conn: decrement conv_no of client 0: 5
GwFreeMemory: free 000000000EEF3480 (len=3700)
GwFreeMemory: act_overflow_size = 20352 (- 3700)
GwIDelR3Conn: idx/conv = ((-1/0) | (10/0)), delete conv 48 from conv-table
GwClearConn: conv_no/tcp_conv_no/sna_conv_no: 6/6/0
GwClearConn: free r3 conv info
GwClearConn: free buffer info
GwFiSearchConvId: deleted 27077110 local, conn=48
GwListInsert: insert elem 48 into conn_free_list (at begin)
GwListInsert: 494 elems in conn_free_list
GwListRemove: remove elem 48 from conn_search_list
GwListRemove: 0 elems in conn_search_list
GwListRemove: elem 48 not in conn_write_list
GwListRemove: remove elem 48 from conn_inuse_list
GwListRemove: 6 elems in conn_inuse_list
GwReadReqIndex: (process_id: -1)
GwReadReqIndex: no filled request-index-block
GwCheckClient: check clients
LOCK APPC ca_blk 4
GwCheckClient: raise timeout for conv 27059938 (intr/uid/mode/comm_idx=9/13261/0/90)
GwSendRcToDp: send appc_rc/sap_rc 10001/221 to dp
make DISP owner of appc_ca_blk 4
DpSemRq: key: 3, units: 1, timeout: -1
DpSemRel: key: 3, units: 1
DpRqPutIntoQueue: put request into queue (reqtype 0, prio LOW, rq_id 43134)
GwDispWakeUp: send wakeup with ni handle 2
NiIWrite: hdl 2 sent data (wrt=1,pac=1,MESG_IO)
-OUT- sender_id APPC_SERVER tid 165 wp_ca_blk -1 wp_id -1
-OUT- action SEND_TO_WP uid 13261 appc_ca_blk 4 type NOWP
-OUT- new_stat NO_CHANGE mode 0 len 80 rq_id 43134
GwListRemove: remove elem 90 from comm_wait_list
GwListRemove: 0 elems in comm_wait_list
GwListRemove: remove elem 90 from comm_wait_list
GwListRemove: 0 elems in comm_wait_list
编辑2:添加的代码示例
我已经创建了一个小的代码例如,如果注意到在最后一个连接保持打开状态。如果我再次启动示例,则在示例结束时两个连接保持打开状态。 所以事情错了......
protected void SAP(object sender, EventArgs e) {
ThreadStart threadStart1 = new ThreadStart(CreateSAP);
Thread thread = new Thread(threadStart1);
Thread thread2 = new Thread(threadStart1);
thread.Start();
Thread.Sleep(2000);
thread2.Start();
while (thread2.IsAlive) {
}
Response.Write("done");
}
private void CreateSAP() {
R3Connection conn = ERPConnection.Connection;
conn.MultithreadingEnvironment = true;
for (int i = 0; i < 12; i++) {
try {
conn.Open();
Thread.Sleep(1000);
} finally {
conn.Close();
}
}
}
不幸的是,这是我在我的代码中做的事情,这不是很... euh ...很好。 ERPConnect有一个R3Connection对象,我在整个应用程序中使用了一个单例。
如果用户正在使用某个连接,同时另一个用户也请求了连接,则R3Connection对象创建了一个新连接(可以使用SAP中的SM04事务进行验证)。 如果两个用户都关闭了连接,两个连接中的一个保持打开状态(我认为这是ERPConnect中的一个错误,但我们无法联系他们,因为我们的支持现在已经过期)。 连接限制(在SAP中定义)在生产环境中快速达到。
我现在为每个用户创建一个R3Connection对象,因此我确信在我的代码中调用Close()方法(或使用语句)时,连接在SAP系统中正确关闭。
代码
public static R3Connection Connection {
get {
ERPConnect.LIC.SetLic("MyLicenseKey");
R3Connection connection = new R3Connection(
[set connection settings]
);
connection.MultithreadingEnvironment = true;
return connection;
}
}
我四处狩猎的答案完全不同的问题,但看到我经历了你迷迷糊糊的,这看起来很像网络配置 - 确保您的SAP服务器“hercules”在Windows防火墙中打开了端口3210,3310和3610(我认为这些端口是正确的 - 可能是3201/3301/3601,很难从SMGW日志中发现),因此没有任何其他防火墙阻止相关的流量,并且“hercules”上的默认网关被设置为可以将流量成功路由到100.100.103.15的设备(我从您的日志中假设这是您的服务器上的.NET应用程序的IP地址正在运行),并且100.100.103.15上的默认网关被设置为可以成功的设备将流量路由到“hercules”。此外,如果您使用完全限定的域名(例如hercules.sap.local)与SAP服务器建立连接,那么您会有更好的运气,因为那样您就不再依赖NetBeOS的史前变幻莫测来找到您的SAP服务器。
这是我的代码中的一个问题。错误确实表明一个网络问题,并在很长一段时间内也朝这个方向搜索...... – thomasvdb
请增加网关跟踪级别(交易互通网关),等到发生了错误,并张贴相应的日志条目。 – vwegert
@vwegert:添加了错误日志的摘录。我不知道这是否足够。在跟踪文件中找到确切的错误并不容易。 – thomasvdb
对不起,没有什么明显的 - 我建议创建一个SAPnet消息,让专家看看... – vwegert