bootstrap58 Ответов: 1

Размер bytearray, полученного клиентом, отличается от размера, отправленного из службы WCF


У меня есть собственная служба WCF которая читает большой RAR файл с помощью binaryreader и возвращает bytearray клиенту

Сервис разбиения файла на части и 10 МБ на части( 10485860 байт)

Я проверял в режиме отладки для размера ByteArray в службу WCF, прежде чем вернуться и увидеть 10485860 байт. Так что это истинный размер.

Но клиент получил 13981237 байт на части, почему такая разница.
Это делает мой файл поврежденным, когда я создаю файл на стороне клиента с полученными байтами
Это мой код от WCF

Dim my_InStream As System.IO.FileStream = Nothing
        Try
            'Dim i As Integer = 0


            my_InStream = New System.IO.FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read)
            Dim my_ibinaryreader As System.IO.BinaryReader = New System.IO.BinaryReader(my_InStream)
            Dim my_splitArr As New ArrayList

            'Dim ofile As FileInfo = New FileInfo(File)

            Dim ofilesize As Long = my_ibinaryreader.BaseStream.Length

            Dim partcount As Integer = ofilesize \ 104857600

            If ofilesize Mod 104857600 <> 0 Then partcount += 1


            my_ibinaryreader.BaseStream.Position = currentPartNumber * 104857600
            Dim myblocksize As Long = 0
            Dim my_bytearray() As Byte

            If currentPartNumber = partcount - 1 Then
                myblocksize = ofilesize - (currentPartNumber * 104857600)
            Else
                myblocksize = 104857600
            End If

            my_bytearray = my_ibinaryreader.ReadBytes(myblocksize)
            my_ibinaryreader.Close()
            my_InStream.Close()
            Return my_bytearray

        Catch ex As Exception
            my_InStream.Close()
            Return Nothing
        End Try


Что я уже пробовал:

Я пытался получить файл как одну часть (420 МБ), но все равно получал другой размер данных и файл был поврежден на стороне клиента

1 Ответов

Рейтинг:
1

Richard Deeming

WCF, скорее всего, кодирует возвращаемые данные как XML или JSON. Вам нужно сказать ему, чтобы он вернул необработанные двоичные данные.

Например:

Public Function GetFilePart(ByVal currentPartNumber As Integer) As Stream
    OutgoingResponse.ContentType = "application/octet-stream"
    
    Dim blockSize As Integer = 104857600
    Dim offset As Long = currentPartNumber * blockSize
    Using inputStream As Stream = File.OpenRead(File)
        inputStream.Seek(offset, SeekOrigin.Begin)
        
        Dim buffer() As Byte = New Byte(blockSize - 1) { }
        Dim count As Integer = inputStream.Read(buffer, 0, buffer.Length)
        Return New MemoryStream(buffer, 0, count)
    End Using
End Function
Смотрите в самом низу эта статья[^] для получения более подробной информации.