Я вынужден подключиться к какой-то службе .net в инструменте VBA, который я разрабатываю. Я использую функцию для возврата кэшированного экземпляра или создания нового, если он еще не создан.
Если с объектом что-то не так (например, истекло время ожидания соединения), в следующий раз, когда я пытаюсь его использовать, я получаю сообщение об ошибке
Объект связи, System.ServiceModel.Channels.ServiceChannel, не может использоваться для связи, поскольку он находится в состоянии Failed.
Я видел эту ошибку, всплывающую по всей сети, но на всех языках, в которых есть блоки try-catch.
Вместо того, чтобы ждать появления этой ошибки при использовании кэшированного экземпляра и обрабатывать его в операторе «On Error Goto», я бы хотел предотвратить возникновение этой ошибки при извлечении кэшированного объекта для использования. Я нигде не мог найти объектную модель для этой вещи, и установка часов на инициализированный объект просто показывает. Какое свойство или тест я могу использовать во время поиска, чтобы определить, находится ли объект в неисправном состоянии?
Private Function GetMRLDIntegrationService() As Object
Const ServiceAddress = "service:mexAddress=""net.tcp://hydfwdvweb001/Integration/MrldIntegrationService.svc/Mex""," & _
"address=""net.tcp://hydfwdvweb001/Integration/MrldIntegrationService.svc/""," & _
"contract=""IMrldSimplexIntegration"", contractNamespace=""http://tempuri.org/""," & _
"binding=""SimplexIntegration"", bindingNamespace=""http://tempuri.org/"""
Static cachedInstance As Object
If Not cachedInstance Is Nothing Then
''//If *DETECT ERROR STATE HERE* Then Set cachedInstance = Nothing
End If
If cachedInstance Is Nothing Then Set cachedInstance = GetObject(ServiceAddress)
If cachedInstance Is Nothing Then Err.Raise 1, , _
"The MRLD server did not respond to the request to provide the service object."
Set GetMRLDIntegrationService = cachedInstance
End Function
В другом месте, в другом методе, это место, где возникает ошибка, и это когда слишком поздно, чтобы элегантно разобраться с ошибкой:
Private Sub FillFromRiskID(ByVal riskID As String)
...
Process_MRLD_Result GetMRLDIntegrationService().GetSerializedRisk(riskID, "1", uName, pWord)
...
End Sub
Спасибо за помощь