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