POST-активность со специальными символами в Direct Line - PullRequest
0 голосов
/ 09 мая 2018

TLDR в конце

В настоящее время мне нужно отправить Activity на DirectLine, отправив сообщение со специальным символом, строка Menú principal, обратите внимание на ú. Все остальное работает нормально, но отправка специальных символов заставляет меня плакать.

Но когда я отправляю сериализованное действие, оно отображает ?, так что вы можете видеть Menú principal != Men? principal, который заставит бота отвечать по-другому.

Я пробовал несколько вещей, но, похоже, это не работает, это моя текущая функция для POST.

    /// <summary>
    /// Uploads to an URL and gets result
    /// </summary>
    /// <typeparam name="T">Type of object you are receiving</typeparam>
    /// <param name="bearer">Token</param>
    /// <param name="url">Url</param>
    /// <param name="serializedJson">Serialized JSON to send</param>
    /// <returns></returns>
    public static T uploadString<T>(string bearer, string url, string serializedJson)
    {
        string serializedResult = "";

        /// Webclient
        using (var client = new WebClient())
        {
            /// Looks like it goes wrong when uplading UTF8 words
            string ansistring = Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(serializedJson));

            try
            {
                /// Add headers
                client.Headers.Add("Content-Type", "application/json");
                client.Headers.Add("Authorization", $"Bearer {bearer}");

                /// Upload string
                serializedResult = client.UploadString(url, ansistring);
            }
            catch (Exception e)
            {
                string a = e.Message;
            }
        }

        /// Get result and return it as an object
        return JsonConvert.DeserializeObject<T>(serializedResult);
    }

Параметр serializedJson - это объект Activity, сериализованный с использованием Json.NET, и он выглядит так, когда я пытаюсь отправить Menú principal.

serializedJson = "{\"type\":\"message\",\"id\":\"c5908d50-5389-11e8-bd5c-45bb8f0ca339\",\"timestamp\":\"2018-05-09T13:06:22.49+00:00\",\"localTimestamp\":null,\"serviceUrl\":null,\"channelId\":null,\"from\":{\"id\":\"default-user\",\"name\":\"User\"},\"conversation\":null,\"recipient\":null,\"textFormat\":\"plain\",\"attachmentLayout\":null,\"membersAdded\":null,\"membersRemoved\":null,\"reactionsAdded\":null,\"reactionsRemoved\":null,\"topicName\":null,\"historyDisclosed\":null,\"locale\":\"es\",\"text\":\"Menú principal\",\"speak\":null,\"inputHint\":null,\"summary\":null,\"suggestedActions\":null,\"attachments\":[],\"entities\":[],\"channelData\":{\"clientActivityId\":\"1525870846394.1792692356311325.10\"},\"action\":null,\"replyToId\":null,\"value\":null,\"name\":null,\"relatesTo\":null,\"code\":null,\"expiration\":null,\"importance\":null,\"deliveryMode\":null,\"textHighlights\":null}"

Как видите, text - это "text\":\"Menú principal\".

После просмотра журнала активности в диалоге он отображает ú как ?.

https://gyazo.com/ff1fa7045de11ab0a5d721bc198363c0

Вы можете найти весь код в этом репозитории, функция uploadString - в этом классе, а тестовые примеры - в этом файле.

TLDR: мне нужно отправить Menú principal на DirectLine, и когда он достигнет бота, он отобразится так: Men? principal

1 Ответ

0 голосов
/ 10 мая 2018

Этот символ не является допустимым символом ASCII. Попробуйте использовать кодировку Unicode для вашей строки:

var stringToSend = Encoding.Unicode.GetString(Encoding.Unicode.GetBytes("Menú principal"));
...