/// <summary>
        /// Process adaptive card and convert it into WeChat response messages.
        /// </summary>
        /// <param name="activity">Message activity from bot.</param>
        /// <param name="attachment">An <see cref="Attachment"/> contains adaptive card content.</param>
        /// <returns>List of WeChat response message.</returns>
        private async Task <IList <IResponseMessageBase> > ProcessAdaptiveCardAsync(IMessageActivity activity, Attachment attachment)
        {
            var messages     = new List <IResponseMessageBase>();
            var adaptiveCard = attachment.ContentAs <AdaptiveCard>();

            try
            {
                var news = await CreateNewsFromAdaptiveCard(activity, adaptiveCard, attachment.Name).ConfigureAwait(false);

                // TODO: Upload news image must be persistent media.
                var uploadResult = await _wechatClient.UploadNewsAsync(new News[] { news }, false).ConfigureAwait(false);

                var mpnews = new MPNewsResponse(activity.From.Id, activity.Recipient.Id, uploadResult.MediaId);
                messages.Add(mpnews);
            }
#pragma warning disable CA1031 // Do not catch general exception types, use fallback text instead.
            catch
#pragma warning disable CA1031 // Do not catch general exception types, use fallback text instead.
            {
                _logger.LogInformation("Convert adaptive card failed.");
                messages.AddRange(GetFixedMessages(activity, adaptiveCard.FallbackText));
            }

            return(messages);
        }
        /// <summary>
        /// Convert hero card to WeChat response message.
        /// </summary>
        /// <param name="activity">Message activity from bot.</param>
        /// <param name="attachment">An <see cref="Attachment"/> contains hero card content.</param>
        /// <returns>List of WeChat response message.</returns>
        private async Task <IList <IResponseMessageBase> > ProcessHeroCardAsync(IMessageActivity activity, Attachment attachment)
        {
            var messages = new List <IResponseMessageBase>();
            var heroCard = attachment.ContentAs <HeroCard>();
            var news     = await CreateNewsFromHeroCard(activity, heroCard).ConfigureAwait(false);

            var uploadResult = await _wechatClient.UploadNewsAsync(new News[] { news }, _uploadTemporaryMedia).ConfigureAwait(false);

            var mpnews = new MPNewsResponse(activity.From.Id, activity.Recipient.Id, uploadResult.MediaId);

            messages.Add(mpnews);
            messages.AddRange(ProcessCardActions(activity, heroCard.Buttons));

            return(messages);
        }