Как правильно закрыть канал WCF Netnamepipebinding? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть привязка WCF Netnamepipe из моего приложения к надстройке Office. Я заметил, что когда офисное приложение занято чем-то другим, мое приложение блокируется при использовании метода WCF. Я добавил пример моего кода. Похоже, что код останавливается и ожидает с помощью метода channel.close.

  1. Есть ли решение изменить channel.close на channel.BeginClose ?
  2. Какой объект состояния мне нужно передать в метод BeginClose?

        Public Function RequestPersonStatus(ByVal id As String, ByVal email As String)
        Using factory As New ChannelFactory(Of IToOffice)(New NetNamedPipeBinding(), New EndpointAddress("net.pipe://localhost/" + XXXXXX))
    
            Dim OfficeChannel As IToOffice = factory.CreateChannel()
    
            Try
                OfficeChannel.RequestPersonStatus(id:=id, email:=email)
            Catch ex As Exception
                Return False
            Finally
                CloseChannel(CType(OfficeChannel, ICommunicationObject))
            End Try
        End Using
    
        Return True
    End Function
    

и closeChannel

        Private Sub CloseChannel(ByVal channel As ICommunicationObject)
        Try
            If channel.State = CommunicationState.Opened Then
                Dim caller As New AsyncCallback(AddressOf callback)
                channel.BeginClose(caller, New Object)
                ' channel.Close()
            End If
        Catch ex As Exception
            Log(LogTypes.AllExceptions, "CloseChannel - Error closing the channel. ", ex.ToString)
        Finally
            channel.Abort()
        End Try
    End Sub

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Похоже, много спорят о том, что и когда нужно очищать / удалять / закрывать каналы. Я просто публикую здесь, что я сейчас делаю, и, таким образом, мой ответ на мой вопрос.

Private Sub CloseChannel(ByVal channel As ICommunicationObject)

        Try
            If channel.State <> CommunicationState.Closed AndAlso channel.State <> CommunicationState.Faulted Then

                channel.BeginClose(Sub(asr)
                                       Try
                                           channel.EndClose(asr)
                                       Catch
                                           channel.Abort()
                                       End Try
                                   End Sub, Nothing)
            Else
                channel.Abort()
            End If

        Catch commEx As CommunicationException
            channel.Abort()
        Catch ex As Exception
            channel.Abort()
        Finally

        End Try

    End Sub
0 голосов
/ 30 апреля 2020

Насколько я знаю, большинство случаев, таких как ошибка тайм-аута / ошибка соединения / связи, вызваны тем, что канал / клиентский прокси не закрыт должным образом. Помещение клиентского прокси / служебного канала в блок использования позволяет устранить проблему.

using (ServiceReference1.ServiceClient client=new ServiceClient())
            {
                var result = client.Test();
                Console.WriteLine(result);
            }

Оператор Using полезен для автоматического закрытия прокси-сервера службы / канала связи службы после завершения вызова. Кроме того, служебный клиентский прокси похож на канал связи, созданный ChannelFactory.
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...