Komisches Problem mit MD5CryptoServiceProvider.ComputeHash und IO.Stream

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Komisches Problem mit MD5CryptoServiceProvider.ComputeHash und IO.Stream

    Mahlzeit,

    habe ein komisches Problem mit dem MD5CryptoServiceProvider.ComputeHash und IO.Streams.
    Ich lade mittels Net.HttpWebRequest Datein von einem Webserver herunter und hashe den Inhalt. Allerdings ist nach dem Aufruf von ComputeHash der Stream leer. Der Dateiname erhält den korrekten Hash. Die Dateien sind jedoch dann leer.
    Wenn ich Computehash weglasse, hat der Stream den korrekten Inhalt und die Dateien werden gespeichert,

    Selbst wenn ich einen neuen Stream erstelle

    VB.NET-Quellcode

    1. Dim hashstreamStream As IO.Stream = responseStream
    und den hashe, dann ist der originale Stream auch leer. z.B:


    Das Problem liegt in Zeile 53. Jemand ne Idee?


    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net
    3. Imports System.Security.Cryptography
    4. Imports System.Text
    5. Imports System.Threading
    6. Imports System.Threading.Tasks
    7. Module Module1
    8. Dim mylinks() As String
    9. Dim mytask() As Task
    10. Dim md5() As MD5CryptoServiceProvider
    11. Dim myrow As String = "http://server.de/bild1.jpg,http://server.de/bild2.jpg,http://server.de/bild3.jpg ..... bis bild16.jpg"
    12. Sub Main()
    13. Try
    14. mylinks = Split(myrow, ",")
    15. ReDim mytask(mylinks.Count)
    16. ReDim md5(mylinks.Count)
    17. For i As Integer = 0 To mylinks.Count - 1
    18. Console.Out.WriteLineAsync(mylinks(i))
    19. mytask(i) = Task.Run(Sub() LoadImageFromUrl(mylinks(i), i.ToString))
    20. mytask(i).Wait()
    21. Next
    22. Console.ReadKey()
    23. Catch ex As Exception
    24. Console.Out.WriteLineAsync(ex.Message.ToString)
    25. Console.ReadKey()
    26. End Try
    27. End Sub
    28. Public Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
    29. Return True
    30. End Function
    31. Public Sub LoadImageFromUrl(ByRef url As String, mycount As String)
    32. Try
    33. md5(mycount) = New MD5CryptoServiceProvider
    34. Dim request As Net.HttpWebRequest = DirectCast(Net.HttpWebRequest.Create(url), Net.HttpWebRequest)
    35. Dim response As Net.HttpWebResponse = DirectCast(request.GetResponse, Net.HttpWebResponse)
    36. Dim responseStream As IO.Stream = response.GetResponseStream()
    37. Dim data As Byte() = md5(mycount).ComputeHash(responseStream)
    38. Dim sBuilder As New StringBuilder()
    39. Dim i As Integer
    40. For i = 0 To data.Length - 1
    41. sBuilder.Append(data(i).ToString("x2"))
    42. Next i
    43. Dim localFile As String = sBuilder.ToString & "-" & mycount & ".jpg"
    44. Dim fs As New IO.FileStream(localFile, FileMode.Create, FileAccess.Write)
    45. Dim buffer(2047) As Byte
    46. Dim read As Integer
    47. Do
    48. read = responseStream.Read(buffer, 0, buffer.Length)
    49. fs.Write(buffer, 0, read)
    50. Loop Until read = 0
    51. responseStream.Close()
    52. fs.Flush()
    53. fs.Close()
    54. responseStream.Close()
    55. response.Close()
    56. Catch ex As Exception
    57. Console.Out.WriteLineAsync(ex.Message.ToString)
    58. End Try
    59. End Sub
    60. End Module

    UllaVB schrieb:

    Selbst wenn ich einen neuen Stream erstelle
    VB.NET-Quellcode

    Dim hashstreamStream As IO.Stream = responseStream

    und den hashe, dann ist der originale Stream auch leer. z.B:
    Jo, einen Stream kann man normalerweise nur einmal lesen, und das gilt ganz besonders für ResponseStream.
    Wennde den also hasht, dann isser ausgelesen, und weitere Lese-Versuche erbringen nichts.