VB. NET System.IO.IOException: дескриптор недействителен. при передаче строки в веб-сервис - PullRequest
0 голосов
/ 24 марта 2020

Передав текстовую строку во внешний веб-сервис, я периодически получаю сообщение об ошибке «недопустимый дескриптор», примерно один раз каждые 30 раз или около того. Каждый второй раз он отправляет без проблем.

Невозможно опубликовать указанный c код, но суть заключается в следующем: 1) Создать и построить объект для отправки в службу 2) Создать объект прокси 3) Вызвать прокси веб-службы, метод attachMessage.

Метод, который возвращает эту ошибку, выглядит примерно так:

Dim msg As String = String.Empty
    Dim header As New ExternalSvc.InputHeader() With {
        .ip_address = GetLocalIpAddress(),
        .language = "english",
        .mac_address = GetLocalMacAddress(),
        .machine_name = My.Computer.Name,
        .user_name = "WEBUSER"}
    Dim headerInfo As String = "IP: " & header.ip_address
    headerInfo += ControlChars.CrLf & "MAC: " & header.mac_address
    headerInfo += ControlChars.CrLf & "Machine: " & header.machine_name
    headerInfo += ControlChars.CrLf & "User: " & header.user_name

    msg = "Header Info: " & headerInfo
    msg += ControlChars.CrLf & "Message includes this information: " & narrative
    Dim proxy As ExternalSvc.attachMessageServicePortTypeClient = Nothing
    Try
        proxy = GetClient()
        result = proxy.attachMessage(header, narrative)
        retval = True
    Catch svcex As ServiceModel.CommunicationException
        My.Application.Log.WriteException(svcex, TraceEventType.Error, "Services SendMessage")
        Throw New VServiceError("Service Communications Failed.", svcex)
    Catch ex As Exception
        My.Application.Log.WriteException(ex, TraceEventType.Error, "Services SendMessage")
        Dim msgex As String = ex.Message
        If msgex.Contains("User not authorized") Then
            msgex = "User '" & "WEBUSER" & "' is not authorized to communicate with the external web service." & ControlChars.CrLf &
                ControlChars.CrLf & "Service message: " & msgex & ControlChars.CrLf & "Notification Info: " & msg
        End If
Finally
        If Not proxy Is Nothing Then
            Try
                proxy.Close()
            Catch ex As Exception
                My.Application.Log.WriteException(ex, TraceEventType.Error, "Services SendServiceMessage")
                proxy.Abort()
            End Try
        End If
    End Try

Трассировка стека выглядит следующим образом:

Process Exception: System.IO.IOException: The handle is invalid.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.IO.StreamWriter.Write(String value)
   at System.Diagnostics.TextWriterTraceListener.Write(String message)
   at System.Diagnostics.DelimitedListTraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id)
   at System.Diagnostics.DelimitedListTraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String message)
   at System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32 id, String message)
   at Microsoft.VisualBasic.Logging.Log.WriteEntry(String message, TraceEventType severity, Int32 id)
   at Microsoft.VisualBasic.Logging.Log.WriteEntry(String message)

Любая помощь будет быть высоко ценится!

...