简体   繁体   English

将PushStreamContent C#代码转换为VB.Net WebAPI 2时出错

[英]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. 我在将此C#代码转换为WebAPI 2 VB.Net项目时遇到了一些困难。

Here's the original C# code 这是原始的C#代码

[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 这是VB.Net的翻译

    <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...' 在此行上是“未为'公共函数WriteToStream ...'的参数'context'指定参数”

    Dim func As Func(Of Stream, HttpContent, TransportContext, Task) = imageStream.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) response.Content =新的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. 我想我没有正确地翻译它,但是我很难在VB.Net中找到想要完成的示例。 Can someone tell me what I'm doing wrong? 有人可以告诉我我在做什么错吗?

The main problem is that you are not using 'AddressOf' - here's the VB equivalent: 主要问题是您没有使用'AddressOf'-这是VB的等效项:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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