Услуги COM+ (ServicedComponent). RPC дает сбой через 15 минут на холостом ходу.

У меня странная проблема с вызовами COM+ RPC с использованием.NET 2.0. Изначально работает нормально. Я могу вызвать метод "Выполнить", и все в порядке. Но если я оставляю клиентское приложение на 15 минут бездействия, а затем пытаюсь выполнить тот же метод, который я получаю, и InvalidCastException:

Unable to cast object of type 'System.__ComObject' to type 'IMyInterface'.

Что более интересно, я получаю это исключение при "Выполнении", не при создании объекта MyClass, а при попытке вызвать метод "Выполнение". И что еще более интересно, - Попытка вызова "Выполнить" работает нормально.

Вот что у меня есть (в псевдокоде):

  1. Сторона клиента:

    namespace Client
    {
        class ClientClass {
           public int MyFunction(....)
           {
                MiddleTier.MyClass cmd = new MiddleTier.MyClass();
                try {
                   cmd.Execute(.....); // Here I got InvalidCastException
                catch(Exception ex) {
                    cmd.Execute(.....); // AND THAT WORKS !!!
                }
            }
        }
    }
    
  2. Сторона сервера:

    namespace MiddleTier {  
        [Guid("....")]
        [System.Runtime.InteropServices.InterfaceType(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsDual)]
        public interface IMyInterface
        {
            int Execute( some params... );
        }
    
        [Guid("....")]
        [ProgId("MyInterface")]
        [ClassInterface(ClassInterfaceType.None)]
        [SecurityRole("MyRole_1")]
        [SecurityRole("MyRole_3")]
        public class MyClass: ServicedComponent, IMyInterface
        {
            public int Execute( ... some params )
            {
               do some stuff
            }
       }
    

    }

Поскольку, как я уже сказал, повторная попытка исправляет проблему, я предполагаю, что что-то потеряно в CLient<-> Comunication. Используя WireShark, я проследил сеть и обнаружил, что отсутствует один вызов от клиента к серверу: Клиент:

No.     Current Time                Time           Source                Destination           Protocol Length Info
 27 2017/319 03:44:02.469243    0.074277       172.68.51.18          172.68.32.43          DCERPC   242    Request: call_id: 11, Fragment: Single, opnum: 5, Ctx: 0
 28 2017/319 03:44:02.469719    0.074753       172.68.32.43          172.68.51.18          DCERPC   130    Response: call_id: 11, Fragment: Single, Ctx: 0   
 29 2017/319 03:44:02.481162    0.086196       172.68.51.18          172.68.32.43          ISystemActivator 822    RemoteCreateInstance request
 30 2017/319 03:44:02.482876    0.087910       172.68.32.43          172.68.51.18          ISystemActivator 1102   RemoteCreateInstance response

Чего не хватает на сервере (call_id:5):

31 2017/319 03:44:02.483569    0.088603       172.68.51.18                 172.68.32.43          DCERPC   258    Request: call_id: 5, Fragment: Single, opnum: 3, Ctx: 0

А позже мы получим ретрансляцию и сброс:

 32 2017/319 03:44:02.518367    0.123401       172.68.51.18          172.68.32.43          TCP      54     59068 → 49409 [ACK] Seq=885 Ack=5717 Win=1026 Len=0
 33 2017/319 03:44:02.534021    0.139055       172.68.51.18          172.68.32.43          TCP      54     59070 → 135 [ACK] Seq=3905 Ack=2887 Win=261632 Len=0
 34 2017/319 03:44:02.784041    0.389075       172.68.51.18          172.68.32.43          TCP      258    [TCP Retransmission] 58927 → 49313 [PSH, ACK] Seq=1 Ack=1 Win=1023 Len=204
 35 2017/319 03:44:03.393448    0.998482       172.68.51.18          172.68.32.43          TCP      258    [TCP Retransmission] 58927 → 49313 [PSH, ACK] Seq=1 Ack=1 Win=1023 Len=204
 36 2017/319 03:44:04.596544    2.201578       172.68.51.18          172.68.32.43          TCP      258    [TCP Retransmission] 58927 → 49313 [PSH, ACK] Seq=1 Ack=1 Win=1023 Len=204
 37 2017/319 03:44:07.002827    4.607861       172.68.51.18          172.68.32.43          TCP      258    [TCP Retransmission] 58927 → 49313 [PSH, ACK] Seq=1 Ack=1 Win=1023 Len=204
 38 2017/319 03:44:11.815440    9.420474       172.68.51.18          172.68.32.43          TCP      258    [TCP Retransmission] 58927 → 49313 [PSH, ACK] Seq=1 Ack=1 Win=1023 Len=204
 39 2017/319 03:44:13.941280    11.546314      172.68.51.18          172.68.32.43          TCP      54     59070 → 135 [FIN, ACK] Seq=3905 Ack=2887 Win=261632 Len=0
 40 2017/319 03:44:13.941734    11.546768      172.68.32.43          172.68.51.18          TCP      60     135 → 59070 [ACK] Seq=2887 Ack=3906 Win=131328 Len=0
 41 2017/319 03:44:13.941795    11.546829      172.68.32.43          172.68.51.18          TCP      60     135 → 59070 [FIN, ACK] Seq=2887 Ack=3906 Win=131328 Len=0
 42 2017/319 03:44:13.941813    11.546847      172.68.51.18          172.68.32.43          TCP      54     59070 → 135 [ACK] Seq=3906 Ack=2888 Win=261632 Len=0
 43 2017/319 03:44:21.425215    19.030249      172.68.51.18          172.68.32.43          TCP      54     58927 → 49313 [RST, ACK] Seq=205 Ack=1 Win=0 Len=0
 44 2017/319 03:44:21.425429    19.030463      172.68.51.18          172.68.32.43          TCP      54     58945 → 49313 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
  1. Журналы сервера:

    7   2017/319 01:44:02.439476    0.010402    172.16.32.43     172.16.51.18   DCERPC  315 Bind_ack: call_id: 115, Fragment: Single, max_xmit: 5840 max_recv: 5840, 2 results: Acceptance, Negotiate ACK
    8   2017/319 01:44:02.448022    0.018948    172.16.51.18    172.16.32.43    DCERPC  274 Alter_context: call_id: 115, Fragment: Single, 1 context items: ISystemActivator V0.0 (32bit NDR)
    9   2017/319 01:44:02.448383    0.019309    172.16.32.43    172.16.51.18    DCERPC  159 Alter_context_resp: call_id: 115, Fragment: Single, max_xmit: 5840 max_recv: 5840, 1 results: Acceptance
    10  2017/319 01:44:02.460395    0.031321    172.16.51.18    172.16.32.43    ISystemActivator    870 RemoteCreateInstance request
    11  2017/319 01:44:02.461425    0.032351    172.16.32.43    172.16.51.18    ISystemActivator    1526    RemoteCreateInstance response
    

и здесь мы должны иметь call_id:5, но мы не делаем

    12  2017/319 01:44:02.468969    0.039895    172.16.51.18    172.16.32.43    TCP 60  59070 → 135 [ACK] Seq=3137 Ack=1839 Win=262656 Len=0
    13  2017/319 01:44:02.468970    0.039896    172.16.51.18    172.16.32.43    DCERPC  210 Request: call_id: 7, Fragment: Single, opnum: 3, Ctx: 0
    14  2017/319 01:44:02.469188    0.040114    172.16.32.43    172.16.51.18    DCERPC  194 Response: call_id: 7, Fragment: Single, Ctx: 0
    15  2017/319 01:44:02.480026    0.050952    172.16.51.18    172.16.32.43    DCERPC  210 Request: call_id: 8, Fragment: Single, opnum: 3, Ctx: 0
    16  2017/319 01:44:02.480367    0.051293    172.16.32.43    172.16.51.18    DCERPC  194 Response: call_id: 8, Fragment: Single, Ctx: 0
    17  2017/319 01:44:02.488802    0.059728    172.16.51.18    172.16.32.43    DCERPC  210 Request: call_id: 9, Fragment: Single, opnum: 3, Ctx: 0

.......

И еще один предмет. Если вызов функции был успешным, я вижу, что в сетевых журналах на сервере и клиенте. Просто время немного отличается.

34  2017/319 02:53:14.716765    0.028642    172.68.51.18    172.68.32.43    DCERPC  2076    Bind: call_id: 4, Fragment: Single, 1 context items: IMyInterface V0.0 (32bit NDR) 
35  2017/319 02:53:14.717085    0.028962    172.68.32.43    172.68.51.18    TCP 60  49313 → 58945 [ACK] Seq=1 Ack=2023 Win=131328 Len=0
34  2017/319 02:53:14.716765    0.028642    172.68.51.18    172.68.32.43    DCERPC  2076    Bind: call_id: 4, Fragment: Single, 1 context items: IMyInterface V0.0 (32bit NDR)
35  2017/319 02:53:14.717085    0.028962    172.68.32.43    172.68.51.18    TCP 60  49313 → 58945 [ACK] Seq=1 Ack=2023 Win=131328 Len=0
36  2017/319 02:53:14.717790    0.029667    172.68.32.43    172.68.51.18    DCERPC  287 Bind_ack: call_id: 4, Fragment: Single, max_xmit: 5840 max_recv: 5840, 1 results: Acceptance
37  2017/319 02:53:14.718023    0.029900    172.68.51.18    172.68.32.43    DCERPC  270 Alter_context: call_id: 4, Fragment: Single, 1 context items: IMyInterface V0.0 (32bit NDR)
38  2017/319 02:53:14.718546    0.030423    172.68.32.43    172.68.51.18    DCERPC  159 Alter_context_resp: call_id: 4, Fragment: Single, max_xmit: 5840 max_recv: 5840, 1 results: Acceptance
39  2017/319 02:53:14.718752    0.030629    172.68.51.18    172.68.32.43    DCERPC  338 Request: call_id: 4, Fragment: Single, opnum: 7, Ctx: 1 IMyInterface V0
40  2017/319 02:53:14.723022    0.034899    172.68.32.43    172.68.51.18    DCERPC  178 Response: call_id: 4, Fragment: Single, Ctx: 1 IMyInterface V0

Любые идеи приветствуются.

0 ответов

Другие вопросы по тегам