Случайная ошибка при подключении к SAP с помощью ERPConnect

Мы используем ERPConnect в нашем приложении ASP.NET, но иногда мы получаем сообщения об ошибках, когда пользователи пытаются подключиться к SAP через наше приложение.

CPIC-CALL: 'CMRCV: rc=19 РАСПОЛОЖЕНИЕ SAP-Gateway на хосте ИМЯ_СЕРВЕРА / sapgw10 ОШИБКА Разговор 53230591 не найден ВРЕМЯ Среда, 16 ноября, 13:49:58 2011 ВЫПУСК 701 КОМПОНЕНТ SAP-Gateway ВЕРСИЯ 2 RC 728 MODULE gwxxrd.c LINE 6278 СЧЕТЧИК 1277701

Это всегда происходит при открытии соединения с SAP через ERPConnect.

R3Connection connection = Connection;
connection.Open(); // the error occurs here

Это довольно случайно. В некоторые дни мы не получаем никаких сообщений об ошибках, в другие дни мы получаем 20 сообщений в день. ERPConnect использует librfc32.dll, определенную в папке System32, и имеет версию 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();
        }
    }
}

person thomasvdb    schedule 16.11.2011    source источник
comment
Пожалуйста, увеличьте уровень трассировки шлюза (транзакция SMGW), дождитесь возникновения ошибки и опубликуйте соответствующие записи в журнале.   -  person vwegert    schedule 17.11.2011
comment
@vwegert: добавлена ​​выдержка из журнала ошибок. Я не знаю, достаточно ли этого. Нелегко найти точную ошибку в файле трассировки.   -  person thomasvdb    schedule 24.11.2011
comment
Извините, ничего очевидного - я бы порекомендовал создать сообщение SAPnet и дать возможность экспертам посмотреть...   -  person vwegert    schedule 25.11.2011
comment
Я думаю, что это как-то связано с тем, что ERPConnect ничего не закрывает соединение должным образом (или я неправильно его реализую). К сожалению, срок нашей поддержки истек, и купить новый пакет поддержки только для этой ошибки довольно дорого.   -  person thomasvdb    schedule 28.11.2011


Ответы (2)


К сожалению, это было что-то, что я сделал в своем коде, что было не очень... эээ... приятно. ERPConnect имеет объект R3Connection, и я использовал синглтон во всем своем приложении.

Если соединение использовалось пользователем, в то время как другой пользователь также запросил соединение, объект R3Connection создал новое соединение (это можно проверить с помощью транзакции SM04 в SAP). Однако, если оба пользователя закрыли соединение, одно из двух соединений осталось открытым (я думаю, это ошибка в ERPConnect, но мы не можем связаться с ними, потому что срок нашей поддержки истек). Предел соединений (определенный в SAP) быстро достигается в производственной среде.

Теперь я создаю объект R3Connection для каждого пользователя, поэтому я уверен, что соединение правильно закрыто в SAP-системе при вызове метода Close() (или оператора using) в моем коде.

Код

public static R3Connection Connection {
        get {
            ERPConnect.LIC.SetLic( "MyLicenseKey" );

            R3Connection connection = new R3Connection( 
                        [set connection settings]
                     );
            connection.MultithreadingEnvironment = true;

            return connection;
        }
    }
person thomasvdb    schedule 26.01.2012
comment
Не могли бы вы показать мне, как вы сделали этот объект соединения для каждого соединения? У меня похожая проблема - person Nate; 01.02.2012
comment
@Nate Я добавил пример кода. Я надеюсь, что это решит вашу проблему! - person thomasvdb; 02.02.2012
comment
эй спасибо. Теобальд ответил на это и сказал, что это ошибка в librfcdll. Новая версия доступна здесь:my.theobald-software.com/index.php?/Knowledgebase/Article/View/ - person Nate; 02.02.2012

Я ищу ответ на совершенно другую проблему, но, поскольку я наткнулся на вашу, это очень похоже на конфигурацию сети — убедитесь, что ваш сервер SAP «hercules» имеет порты 3210, 3310 и 3610 (я думаю, что это правильно - может быть 3201/3301/3601, трудно сказать из журналов SMGW), открытый в брандмауэре Windows, что нет никаких других брандмауэров, блокирующих соответствующий трафик, и что шлюз по умолчанию на "hercules" установлен на устройство, которое может успешно направлять трафик на 100.100.103.15 (из ваших журналов я предполагаю, что это IP-адрес вашего сервера, на котором работает приложение .NET), и что шлюз по умолчанию на 100.100.103.15 установлен на устройство, которое может успешно направлять трафик на «Геркулес». Кроме того, вам повезет больше, если вы будете использовать полное доменное имя (например, hercules.sap.local) для подключения к вашему серверу SAP, потому что тогда вы больше не будете полагаться на доисторические капризы NetBIOS для поиска вашего САП-сервер.

person Rob Moss    schedule 17.01.2012
comment
Это была проблема в моем коде. Ошибка действительно свидетельствует о проблеме с сетью и тоже долго искал в этом направлении... - person thomasvdb; 26.01.2012