使用ERPConnect连接到SAP时出现随机错误

使用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(); 
     } 
    } 
} 
+0

请增加网关跟踪级别(交易互通网关),等到发生了错误,并张贴相应的日志条目。 – vwegert

+0

@vwegert:添加了错误日志的摘录。我不知道这是否足够。在跟踪文件中找到确切的错误并不容易。 – thomasvdb

+0

对不起,没有什么明显的 - 我建议创建一个SAPnet消息,让专家看看... – vwegert

不幸的是,这是我在我的代码中做的事情,这不是很... 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; 
     } 
    } 
+0

你能告诉我你是如何为每个连接做连接对象的吗?我有类似的问题 – Nate

+0

@Nate我已经添加了一个代码示例。我希望它能解决你的问题! – thomasvdb

+1

嘿谢谢。 Theobald对此作出了回应,并称这是librfcdll中的一个错误。这里有一个新的版本:http://my.theobald-software.com/index.php?/ Knowledgebase/Article/View/54/9/useful-links – Nate

我四处狩猎的答案完全不同的问题,但看到我经历了你迷迷糊糊的,这看起来很像网络配置 - 确保您的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服务器。

+1

这是我的代码中的一个问题。错误确实表明一个网络问题,并在很长一段时间内也朝这个方向搜索...... – thomasvdb