Преобразовать C# Перевод текстового кода API из asyn c в syn c для SQL Функция CLR сервера - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть следующий код от Microsoft для использования их API для перевода текста. Я зарегистрировался для ключей, и код работает, но я не могу понять, как преобразовать это обратно из async / await. Обычно спрашивают, как преобразовать код в async / await.

Мне нужно, чтобы это было синхронно, чтобы его можно было вызвать из SQL Server CLR-функции, которую я изучил не поддерживает asyn c. Я предполагаю, что не могу использовать HttpClient или HttpRequestMessage, но я иду по кругу, пытаясь выяснить это.

    // ***** PERFORM TRANSLATION ON BUTTON CLICK
    private async void TranslateButton_Click(object sender, EventArgs e)
    {
        string textToTranslate = TextToTranslate.Text.Trim();

        // Send translation request
        object[] body = new object[] { new { Text = textToTranslate } };
        var requestBody = JsonConvert.SerializeObject(body);

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri("https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&from=en&to=fr");
            request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");
            request.Headers.Add("Ocp-Apim-Subscription-Key", "00000000");

            var response = await client.SendAsync(request);
            var responseBody = await response.Content.ReadAsStringAsync();

            var result = JsonConvert.DeserializeObject<List<Dictionary<string, List<Dictionary<string, string>>>>>(responseBody);
            var translation = result[0]["translations"][0]["text"];

            // Update the translation field
            TranslatedTextLabel.Content = translation;
         }
     }

Это некоторый код 2013 года. Я предполагаю, что это работал, но текстовый API переводчика изменился с тех пор. Все почтовые запросы должны быть в формате Json и токены доступа больше не являются обязательными.

public static string CallTranslator(string txtToTranslate)
{
    string uri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=" + System.Web.HttpUtility.UrlEncode(txtToTranslate) + "&from=en&to=fr";
    System.Net.WebRequest translationWebRequest = System.Net.WebRequest.Create(uri);
    string headerValue = GetAccessToken();
    translationWebRequest.Headers.Add("Authorization", headerValue);
    System.Net.WebResponse response = null;
    response = translationWebRequest.GetResponse();
    System.IO.Stream stream = response.GetResponseStream();
    System.Text.Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
    System.IO.StreamReader translatedStream = new System.IO.StreamReader(stream, encode);
    System.Xml.XmlDocument xTranslation = new System.Xml.XmlDocument();
    xTranslation.LoadXml(translatedStream.ReadToEnd());

    return xTranslation.InnerText;
}

1 Ответ

1 голос
/ 27 февраля 2020

var response = HttpClientHelper.Instance (). SendAsyn c (запрос) .Result; var jsonResponse = response.Content.ReadAsStringAsyn c () .Result ;

...