Услуги COM+ (ServicedComponent). RPC дает сбой через 15 минут на холостом ходу.
У меня странная проблема с вызовами COM+ RPC с использованием.NET 2.0. Изначально работает нормально. Я могу вызвать метод "Выполнить", и все в порядке. Но если я оставляю клиентское приложение на 15 минут бездействия, а затем пытаюсь выполнить тот же метод, который я получаю, и InvalidCastException:
Unable to cast object of type 'System.__ComObject' to type 'IMyInterface'.
Что более интересно, я получаю это исключение при "Выполнении", не при создании объекта MyClass, а при попытке вызвать метод "Выполнение". И что еще более интересно, - Попытка вызова "Выполнить" работает нормально.
Вот что у меня есть (в псевдокоде):
Сторона клиента:
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 !!! } } } }
Сторона сервера:
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
Журналы сервера:
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
Любые идеи приветствуются.