0

我在将this C# code转换为WebAPI 2 VB.Net项目时遇到了一些困难。将PushStreamContent C#代码转换为VB.Net时出错WebAPI 2

这里是原来的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); 
     } 
    } 
} 

下面是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 

我看到两个问题:

  1. 在这条线是一个“参数没有为'Public Function WriteToStream ...'的参数'context'指定'

    昏暗FUNC作为Func键(中流,HttpContent,TransportContext,任务)= imageStream.WriteToStream

  2. 的重载决策失败,因为没有可访问的 '新' 可以用这些参数

    响应被称为。内容=新PushStreamContent(FUNC)

我想,我没有正确翻译这一点,但我很难找到在VB.Net任何实例为了我想要完成的事情。有人能告诉我我做错了什么吗?

回答

1

的主要问题是,你是不是使用“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 
+0

的伎俩,和漂亮的风风火火的边界属性 – user1532208