Обработка действия AdaptiveCard get «Извините, у моего бота-кода проблема». - PullRequest
0 голосов
/ 19 мая 2018

У меня проблемы с одним проектом, обрабатывающим действия с AdaptiveCards.Мой метод отлично работает во всех других моих проектах, но не самый последний.Я попытался откатить версии bot.builder и bot.connector, чтобы они соответствовали другим проектам, но это не помогло.

Карта отображается нормально, но как только вы нажмете кнопку, вы получите старый добрый «Извините, у моего бота-кода проблема».Я отображаю карту в RootDialog и вызываю context.wait (MessageReceivedAsync)

Отладка, если я что-то печатаю боту после того, как карта была отображена, MessageReceivedAsync запускается.Нажав на кнопку, никогда не попадет туда.Помещая точку останова непосредственно в MessageController, он туда попадает, но вход в него просто умирает и показывает: «Извините, у моего бота-кода возникла проблема».

Вот мой MessageController:

    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {

        if (activity.Type == ActivityTypes.Message)
        {
            ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
            await Conversation.SendAsync(activity, () => new RootDialog());
        }

Вот действие адаптивной карты:

  "actions": [
{
  "type": "Action.Submit",
  "title": "Create On-Line Request",
  "data": {
    "action": "requestContact"
  }
}

]}

В моем RootDialog:

            await context.PostAsync(CardHelper.MakeCard(context, "~\\AdaptiveCards\\ContactInfo311.json", replacements));
            context.Wait(MessageReceivedAsync);

1 Ответ

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

Карта отображается нормально, но как только вы нажмете кнопку, вы получите старый добрый «Извините, у моего бота-кода проблема».

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

В RootDialog:

[Serializable]
public class RootDialog : IDialog<object>
{
    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        var replymes = context.MakeMessage();

        if (activity.Text != null)
        {
            if (activity.Text.ToLower().Contains("cards"))
            {
                replymes = context.MakeMessage();

                var cardjson = await GetCardText("ContactInfo311");

                var results = AdaptiveCard.FromJson(cardjson);
                var card = results.Card;

                replymes.Attachments.Add(new Attachment()
                {
                    Content = card,
                    ContentType = AdaptiveCard.ContentType,
                    Name = "Card"
                });
            }
            else
            {
                replymes.Text = $"You sent {activity.Text}";
            }
        }
        else if (activity.Value != null)
        {
            replymes.Text = $"submit data: {activity.Value}";
        }

        // return our reply to the user
        await context.PostAsync(replymes);

        context.Wait(MessageReceivedAsync);
    }

    public async Task<string> GetCardText(string cardName)
    {
        var path = System.Web.HttpContext.Current.Server.MapPath($"~/AdaptiveCards/{cardName}.json");

        if (!File.Exists(path))
            return string.Empty;

        using (var f = File.OpenText(path))
        {
            return await f.ReadToEndAsync();
        }
    }
}

ContactInfo311.json

{
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "TextBlock",
      "size": "large",
      "weight": "bolder",
      "text": "This is Adaptive Card"
    }
  ],
  "actions": [
    {
      "type": "Action.Submit",
      "data": {
        "action": "requestContact"
      },
      "title": "Clike me"
    }
  ]
}

packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="AdaptiveCards" version="1.0.0" targetFramework="net46" />
  <package id="Autofac" version="3.5.2" targetFramework="net46" />
  <package id="Chronic.Signed" version="0.3.2" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.Bot.Builder" version="3.15.2.2" targetFramework="net46" />
  <package id="Microsoft.Bot.Connector" version="3.15.2.2" targetFramework="net46" />
  <package id="Microsoft.CSharp" version="4.4.0" targetFramework="net46" />
  <package id="Microsoft.IdentityModel.Logging" version="1.1.4" targetFramework="net46" />
  <package id="Microsoft.IdentityModel.Protocol.Extensions" version="1.0.4.403061554" targetFramework="net46" />
  <package id="Microsoft.IdentityModel.Protocols" version="2.1.4" targetFramework="net46" />
  <package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="2.1.4" targetFramework="net46" />
  <package id="Microsoft.IdentityModel.Tokens" version="5.1.4" targetFramework="net46" />
  <package id="Microsoft.Rest.ClientRuntime" version="2.3.2" targetFramework="net46" />
  <package id="Microsoft.WindowsAzure.ConfigurationManager" version="3.1.0" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net46" />
  <package id="System.IdentityModel.Tokens.Jwt" version="5.1.4" targetFramework="net46" />
</packages>

Результат теста:

enter image description here

Кроме того, чтобы устранить проблему с вашим проектом, вы можете установить точку останова и пошагово отладить код, чтобы отследить activity и проверить, вызвана ли ошибка activity.Text=null.

enter image description here

...