Передав текстовую строку во внешний веб-сервис, я периодически получаю сообщение об ошибке «недопустимый дескриптор», примерно один раз каждые 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)
Любая помощь будет быть высоко ценится!