Исключение API Microsoft Translator: «Данные на корневом уровне недопустимы. Строка 1, позиция 1 «.

#c# #.net #exception #microsoft-translator

#c# #.net #исключение #microsoft-translator

Вопрос:

Я выполняю миграцию Microsoft Translation с версии v2 на версию v3. Но я получаю следующее исключение:

Произошла ошибка десериализации объекта типа System.Строка. Данные на корневом уровне недопустимы. Строка 1, позиция 1.
(System.Runtime.Сериализация.Исключение SerializationException)

Внутреннее исключение: данные на корневом уровне недопустимы. Строка 1, позиция 1.
Система.Исключение {System.Xml.XmlException}

Эта ошибка возникает в этой строке кода:

 translation.Append((string)dcs.ReadObject(response));
 

Полный метод:

 public string TranslateText(string from, string to, string text)
{
        var token = string.Empty;

        try
        {
            retryPolicy.Execute(() =>
            {
                token = azureAuthentication.GetAccessToken();
            });

            var translation = new StringBuilder();
            int charLength = Configuration.Configuration.CharLength;

            List<string> lines = text.Split('.').Aggregate(new[] { "" }.ToList(), (a, x) =>
            {
                var last = a[a.Count - 1];

                if ((last   x).Length > charLength)
                {
                    a.Add(x);
                }
                else
                {
                    a[a.Count - 1] = ($"{last}{x}.");
                }

                return a;
            });
            
            foreach (var str in lines)
            {
                string uri =$"https://api.cognitive.microsofttranslator.com/languages?api-version=3.0amp;scope=translationamp;textType={HttpUtility.UrlEncode(str)}amp;from=from_langamp;to=to_lang";
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
                httpWebRequest.Headers.Add("Authorization", token);

                try
                {
                    retryPolicy.Execute(() =>
                    {
                        using (var response = httpWebRequest.GetResponse().GetResponseStream())
                        {
                            var dcs = new DataContractSerializer(Type.GetType("System.String"));
                            translation.Append((string)dcs.ReadObject(response));
                        }
                    });

                }
                catch (Exception ex)
                {
                    throw new ExternalServiceUnavailableException(ex.Message, ex);
                }
            }

            return translation.ToString();
        }
        catch(Exception ex)
        {
            throw new ExternalServiceUnavailableException(ex.Message, ex);
        }
 }
 

Я понятия не имею, почему возникает эта ошибка. Я просмотрел другие вопросы, касающиеся этой ошибки, но я не уверен, как реализовать эти решения здесь.

Спасибо

Комментарии:

1. docs.microsoft.com/en-us/azure/cognitive-services/translator/…

Ответ №1:

Я думаю, что вы получаете ошибку в своем запросе, поэтому десериализация не выполняется. Я думаю, что эта часть from=from_langamp;to=to_lang должна быть from={from_lang}amp;to={to_lang}

Вы устанавливаете буквальную строку from_lang вместо имени допустимого языка, например en или es.