我试图通过一个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],而我期望的是翻译后的字符串。
发布于 2020-01-23 20:57:01
我使用你的代码作为基础,并使其正常工作。只需使用一个简单的Webform。

我没有更改代码中的任何内容,但系统提示我添加
Imports System.Net.Http由Visual studio 2019提供
vb.aspx后面的最终整个webform代码如下所示:
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属性
发布于 2020-02-04 09:11:48
<%@ 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>https://stackoverflow.com/questions/56927519
复制相似问题