【问题标题】:Microsoft Translator API v3, ASP.NET VB.NET微软翻译 API v3, ASP.NET VB.NET
【发布时间】:2019-11-17 12:45:55
【问题描述】:

我正在尝试通过 ASP.NET 函数调用 MS Translator API 来翻译数据库中的各种字符串。

MS 中的所有示例都是用 C# 给出的,所以我将其放入转换器并从那里开始。 根据我的搜索,我很确定这是一个异步/等待问题。我也尝试在不同的时间将 strString 设置为不同的东西,但它会引发相同的错误,就好像我没有正确等待一样。

从aspx页面我有这个:

<%# functions.translate(Eval("Description").ToString) %>

Description 是数据库中的一个字段,如果未传递给 translate 函数,则会正确显示。我还调用了其他函数来执行各种操作并正常工作。

在我的functions.vb中我有:

Public Class TranslationResult
    Public Property Translations As Translation()
End Class

Public Class Translation
    Public Property Text As String
    Public Property [To] As String
End Class

Public Class functions

    Public Shared Async Function translate(strString As String) As Task(Of String)

        Dim host As String = "https://api.cognitive.microsofttranslator.com"
        Dim route As String = "/translate?api-version=3.0&to=fr"
        Dim key As String = "0000000000000000000000000"
        Dim body As Object() = New Object() {New With {Key .Text = strString}}
        Dim requestBody = JsonConvert.SerializeObject(body)

        Using client = New HttpClient()
            Using request = New HttpRequestMessage()
                request.Method = HttpMethod.Post
                request.RequestUri = New Uri(host & route)
                request.Content = New StringContent(requestBody, Encoding.UTF8, "application/json")
                request.Headers.Add("Ocp-Apim-Subscription-Key", key)
                Dim response As HttpResponseMessage = Await client.SendAsync(request).ConfigureAwait(False)
                Dim result As String = Await response.Content.ReadAsStringAsync()
                Dim deserializedOutput As TranslationResult() = JsonConvert.DeserializeObject(Of TranslationResult())(result)
                For Each o As TranslationResult In deserializedOutput
                    For Each t As Translation In o.Translations
                        strString = t.Text
                    Next
                Next
            End Using
        End Using

        Return strString

    End Function

当我期待翻译字符串时,我得到的错误是在显示 System.Threading.Tasks.Task`1[System.String] 的网页上。

【问题讨论】:

  • 你要翻译的代码的c#版本是什么?
  • 该方法声明为Async,这意味着如果您在其中返回String,它将返回Task(Of String),这就是为什么您会在您的页。要从Task 获取String 结果,您通常等待异步方法。不确定 ASPX 是否支持它,但如果支持,它将是 &lt;%# Await functions.translate(Eval("Description").ToString) %&gt;
  • 转换后的代码示例指出“此示例需要 C# 7.1 或更高版本才能进行异步/等待。在函数前面添加等待。翻译等会导致错误““等待”只能在以下情况下使用包含在标有 'Async' 修饰符的方法或 lambda 表达式中。"

标签: asp.net json vb.net microsoft-translator


【解决方案1】:

我使用您的代码作为基础并使其正常工作。只需使用一个简单的 Web 表单。

没有更改代码中的任何内容,但系统提示我添加

Imports System.Net.Http

由 Visual Studio 2019 提供

最终的整个 webform 代码隐藏 vb.aspx 如下所示:

Imports System.Net.Http
Imports System.Threading.Tasks
Imports Newtonsoft.Json

Public Class microsoftTranslator
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

   dim translatedText =  functions.translate( "This is going to be one, two, three in french").Result

End Sub

Public Class TranslationResult
    Public Property Translations As Translation()
End Class

Public Class Translation
    Public Property Text As String
    Public Property [To] As String
End Class

Public Class functions

Public Shared Async Function translate(strString As String) As Task(Of String)

    Dim host As String = "https://api.cognitive.microsofttranslator.com"
    Dim route As String = "/translate?api-version=3.0&to=fr"
    Dim key As String = "0000000000000000000000000"
    Dim body As Object() = New Object() {New With {Key .Text = strString}}
    Dim requestBody = JsonConvert.SerializeObject(body)

    Using client = New HttpClient()
        Using request = New HttpRequestMessage()
            request.Method = HttpMethod.Post
            request.RequestUri = New Uri(host & route)
            request.Content = New StringContent(requestBody, Encoding.UTF8, "application/json")
            request.Headers.Add("Ocp-Apim-Subscription-Key", key)
            Dim response As HttpResponseMessage = Await client.SendAsync(request).ConfigureAwait(False)
            Dim result As String = Await response.Content.ReadAsStringAsync()
            Dim deserializedOutput As TranslationResult() = JsonConvert.DeserializeObject(Of TranslationResult())(result)
            For Each o As TranslationResult In deserializedOutput
                For Each t As Translation In o.Translations
                    strString = t.Text
                Next
            Next
        End Using
    End Using

    Return strString

End Function
end class

End Class

要让它等待异步结果,请查看.result 属性

【讨论】:

    【解决方案2】:
        <%@ Page Language="VB" %>
    
    <%@ Import Namespace="System.IO" %>
    
    <%@ Import Namespace="System.Net" %>
    
    <!DOCTYPE html>
    
    <script runat="server">
    
        Protected Sub Page_Load(sender As Object, e As EventArgs)
            Dim APIUrlToSend As String = "https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&from=en&to=de"
            Dim MyMainRequest As HttpWebRequest = CType(HttpWebRequest.Create(APIUrlToSend), HttpWebRequest)
            MyMainRequest.Headers.Add("Ocp-Apim-Subscription-Key", "YOUR API CODE")
            MyMainRequest.ContentType = "application/json; charset=utf-8"
            MyMainRequest.Method = "POST"
            ' Send request
            Dim MyJavaScriptSerializer = New System.Web.Script.Serialization.JavaScriptSerializer()
            Dim TextToTranslate As String = MyJavaScriptSerializer.Serialize("Text to translate")
            Dim MyMainRequestBody As String = "[{ Text: " & TextToTranslate & " }]"
            Dim MyMainRequestBytesData As Byte() = Encoding.UTF8.GetBytes(MyMainRequestBody)
            MyMainRequest.ContentLength = MyMainRequestBytesData.Length
            Using RequestWriteStream = MyMainRequest.GetRequestStream()
                RequestWriteStream.Write(MyMainRequestBytesData, 0, MyMainRequestBytesData.Length)
            End Using
            Dim MyFinalResponse As HttpWebResponse = MyMainRequest.GetResponse()
            Dim MyFinalResponseStream As Stream = MyFinalResponse.GetResponseStream
            Dim MyFinalResponseStreamReader As New StreamReader(MyFinalResponseStream, Encoding.GetEncoding("utf-8"))
            Page.Response.Write(MyFinalResponseStreamReader.ReadToEnd())
    
        End Sub
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
    
        </div>
        </form>
    </body>
    </html>
    

    【讨论】:

    • 虽然这段代码可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    相关资源
    最近更新 更多