Извлечь вложение из активности в канале DirectLine

У меня есть бот, который работает с использованием встроенных каналов вместе с DirectLine для пользовательских каналов.

В канале DirectLine я получаю ответные действия и пытаюсь извлечь информацию из Attachments, чтобы преобразовать ее в настраиваемый формат канала.

Анализируя действия, я проверяю наличие вложения и обнаруживаю, что оно находится на "ContentType" = "application/vnd.microsoft.card.hero". Затем я пытаюсь преобразовать вложение Content как HeroCard. Это не работает в канале DirectLine. В рамках моих модульных тестов встроенных каналов я могу это сделать и правильно проверить все свои данные.

Разве это не ожидаемое поведение? Как я могу получить содержимое вложения в канале DirectLine?

var type = attachment.ContentType;
if (type == "application/vnd.microsoft.card.hero")
{
    var temp = attachment.Content;
    var heroCard = temp as HeroCard; // This yields a 'null'
    ...
}

Примечание: если я заменю строку «var heroCard = temp as HeroCard;» с участием

var temp = JsonConvert.SerializeObject(attachment.Content);
var heroCard = JsonConvert.DeserializeObject<HeroCard>(temp);

Затем у меня есть карта героя, которую я могу разобрать. Но это кажется очень неэффективным.


person NiteLordz    schedule 06.07.2018    source источник
comment
Привет, NiteLordz! Не могли бы вы пояснить, что именно вы хотите извлечь? Если вы хотите извлечь настоящую карточку, например вложение в электронном письме, это невозможно. Карты героев, как и все многофункциональные / адаптивные карты, представляют собой объекты JSON.   -  person JJ_Wailes    schedule 06.07.2018
comment
Конечно. Я не пытаюсь отобразить его, я пытаюсь получить доступ к внутренним элементам карты (заголовок, подзаголовок и т. Д.). Прямо сейчас Attachment.Content - это объект. Я надеялся, что смогу выполнить простое приведение к HeroCard, но это не удалось. Я могу взять объект, сериализовать его в строку, а затем десериализовать в карту героя. На этом этапе я могу получить заголовок, подзаголовок, изображения и т. Д. И передать их реализации настраиваемого канала.   -  person NiteLordz    schedule 06.07.2018


Ответы (1)


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

вы можете немного оптимизировать текущий код, не сериализуя его сначала, то есть:

var heroCard = JsonConvert.DeserializeObject<HeroCard>(attachment.Content.ToString());

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

person Alan Tsai    schedule 09.07.2018