简体   繁体   中英

Error converting PushStreamContent C# code to VB.Net WebAPI 2

I'm having some difficulty converting this C# code to a WebAPI 2 VB.Net project.

Here's the original C# code

[HttpGet]
public HttpResponseMessage FromImages() {

    var imageStream = new ImageStream();
    Func<Stream, HttpContent, TransportContext, Task> func = imageStream.WriteToStream;
    var response = Request.CreateResponse();
    response.Content = new PushStreamContent(func);
    response.Content.Headers.Remove("Content-Type");
    response.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/x-mixed-replace;boundary=" + imageStream.Boundary);
    return response;

}

internal class ImageStream {
    public object Boundary { get; private set; } = "HintDesk";

    public async Task WriteToStream(Stream outputStream, HttpContent content, TransportContext context) {
        byte[] newLine = Encoding.UTF8.GetBytes("\r\n");

        foreach (var file in Directory.GetFiles(@"TestData\Images", "*.jpg")) {
            var fileInfo = new FileInfo(file);
            var header = $"--{Boundary}\r\nContent-Type: image/jpeg\r\nContent-Length: {fileInfo.Length}\r\n\r\n";
            var headerData = Encoding.UTF8.GetBytes(header);
            await outputStream.WriteAsync(headerData, 0, headerData.Length);
            await fileInfo.OpenRead().CopyToAsync(outputStream);
            await outputStream.WriteAsync(newLine, 0, newLine.Length);
            await Task.Delay(1000 / 30);
        }
    }
}

Here's the VB.Net translation

    <HttpGet> _
    Public Function FromImages() As HttpResponseMessage
        Dim imageStream = New ImageStream()
        Dim func As Func(Of Stream, HttpContent, TransportContext, Task) = imageStream.WriteToStream
        Dim response = Request.CreateResponse()
        response.Content = New PushStreamContent(func)
        response.Content.Headers.Remove("Content-Type")
        response.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/x-mixed-replace;boundary=" + imageStream.Boundary)
        Return response
    End Function

    Friend Class ImageStream

        Public Function WriteToStream(outputStream As Stream, content As HttpContent, context As TransportContext) As Task
            Dim newLine As Byte() = Encoding.UTF8.GetBytes(vbCr & vbLf)

            For Each file As var In Directory.GetFiles("TestData\Images", "*.jpg")
                Dim fileInfo = New FileInfo(file)
                Dim header = "--{Boundary}" & vbCr & vbLf & "Content-Type: image/jpeg" & vbCr & vbLf & "Content-Length: {fileInfo.Length}" & vbCr & vbLf & vbCr & vbLf
                Dim headerData = Encoding.UTF8.GetBytes(header)
                Await outputStream.WriteAsync(headerData, 0, headerData.Length)
                Await fileInfo.OpenRead().CopyToAsync(outputStream)
                Await outputStream.WriteAsync(newLine, 0, newLine.Length)
                Await Task.Delay(1000 / 30)
            Next
        End Function

    End Class

I'm seeing two problems:

  1. On this line is a 'Argument not specified for parameter 'context' of 'Public Function WriteToStream...'

    Dim func As Func(Of Stream, HttpContent, TransportContext, Task) = imageStream.WriteToStream

  2. An Overload resolution failed because no accessible 'New' can be called with these arguments

    response.Content = New PushStreamContent(func)

I imagine that I didn't translate this correctly, but I'm having difficulty finding any examples in VB.Net for what I'm trying to accomplish. Can someone tell me what I'm doing wrong?

The main problem is that you are not using 'AddressOf' - here's the VB equivalent:

Option Infer On

Imports Microsoft.VisualBasic

<HttpGet>
Public Function FromImages() As HttpResponseMessage

    Dim imageStream = New ImageStream()
    Dim func As Func(Of Stream, HttpContent, TransportContext, Task) = AddressOf imageStream.WriteToStream
    Dim response = Request.CreateResponse()
    response.Content = New PushStreamContent(func)
    response.Content.Headers.Remove("Content-Type")
    response.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/x-mixed-replace;boundary=" & imageStream.Boundary)
    Return response

End Function

Friend Class ImageStream
    Private privateBoundary As Object = "HintDesk"
    Public Property Boundary() As Object
        Get
            Return privateBoundary
        End Get
        Private Set(ByVal value As Object)
            privateBoundary = value
        End Set
    End Property

    Public Async Function WriteToStream(ByVal outputStream As Stream, ByVal content As HttpContent, ByVal context As TransportContext) As Task
        Dim newLine() As Byte = Encoding.UTF8.GetBytes(ControlChars.CrLf)

        For Each file In Directory.GetFiles("TestData\Images", "*.jpg")
            Dim fileInfo = New FileInfo(file)
            Dim header = $"--{Boundary}" & ControlChars.CrLf & "Content-Type: image/jpeg" & ControlChars.CrLf & "Content-Length: {1}" & ControlChars.CrLf & ControlChars.CrLf
            Dim headerData = Encoding.UTF8.GetBytes(header)
            Await outputStream.WriteAsync(headerData, 0, headerData.Length)
            Await fileInfo.OpenRead().CopyToAsync(outputStream)
            Await outputStream.WriteAsync(newLine, 0, newLine.Length)
            Await Task.Delay(1000 \ 30)
        Next file
    End Function
End Class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM