为什么我无法在 Skype 频道的 Azure 表中保存和检索机器人数据?
Why I can't save and retrieve bot data in Azure Tables in Skype channel?
过去三个月我一直在使用 bot,我的 Bot 在 Webchannel、direct line、telegram 中完成,现在我在 Skype 频道上工作,一切都很好,除了从 Azure Tables 保存和检索数据,我在 Azure 门户日志中收到错误 "Unknown activity type"。
您可以在下面找到我的代码:
这是主根对话框class
using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using SimpleEchoBot.Formulário;
using Microsoft.Bot.Builder.FormFlow;
using SimpleEchoBot.Serviço;
using System.Collections.Generic;
using System.Text;
using AdaptiveCards;
using System.Threading;
namespace SimpleEchoBot.Dialogs
{
[Serializable]
public class RootDialog : IDialog<EntidadeCliente>
{
private string nome;
private string email;
public async Task StartAsync(IDialogContext context)
{
if (context.Activity.ChannelId == "telegram")
{
context.Wait(TelegramAsync);
}
else if (context.Activity.ChannelId == "skype")
{
context.Wait(SkypeAsync);
}
else
{
context.Wait(MessageReceivedAsync);
}
}
private async Task SkypeAsync(IDialogContext context,
IAwaitable<IMessageActivity> result)
{
context.Call(new NomeDialog(), NomeDialogResumeAfter);
}
private async Task NomeDialogResumeAfter(IDialogContext
context,IAwaitable<string> result)
{
try
{
nome = await result;
BuscarDadosAzure buscarDadosAzure = new BuscarDadosAzure();
EntidadeCliente cliente = new EntidadeCliente();
GravarDadosAzure gravarDadosAzure = new GravarDadosAzure();
cliente = buscarDadosAzure.PesquisarAtendimento(nome);
gravarDadosAzure.GravarDados(context, cliente);
await context.PostAsync($"Agora que já nos conhecemos { nome }, quais
seriam as informações poderia lhe ajudar?");
context.Wait(MessageReceivedAsync);
}
catch (TooManyAttemptsException)
{
await context.PostAsync("Me desculpe, não consegui registrar o seu
nome, agradecemos a sua visita.");
context.EndConversation(EndOfConversationCodes.UserCancelled);
}
}
}
这class将数据保存到Azure
public class GravarDadosAzure
{
public EntidadeCliente GravarDados(IDialogContext context,
EntidadeCliente cliente)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString2"));
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
Microsoft.WindowsAzure.Storage.Table.CloudTable table =
tableClient.GetTableReference("Usuario");
TableOperation insertOperation =
TableOperation.InsertOrReplace(cliente);
table.Execute(insertOperation);
return cliente;
}
这 Class 从 Azure 检索数据。
public EntidadeCliente PesquisarAtendimento(EntidadeCliente cliente,
[Optional] string
ConversationId)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString2"));
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("Usuario");
if (ConversationId == null)
{
TableQuery<EntidadeCliente> query = new TableQuery<EntidadeCliente>
().Where(TableQuery.GenerateFilterCondition("Nome",
QueryComparisons.Equal, cliente.nome));
BuscarEntidade(table, cliente, query);
}
else
{
TableQuery<EntidadeCliente> query = new TableQuery<EntidadeCliente>
().Where(TableQuery.GenerateFilterCondition("ConversationId",
QueryComparisons.Equal, ConversationId));
BuscarEntidade(table, cliente, query);
}
return cliente;
}
我找到了解决方案,我在 Skype 中使用的一些值与我在直线中使用的相同,而该值在 Skype 中为空,这就是 Azure 不接受插入操作的原因。
我认为我的密钥(context.Activity.ChannelId + 空值)在 Azure 门户日志中生成了错误消息 "Unknown activity type"。
过去三个月我一直在使用 bot,我的 Bot 在 Webchannel、direct line、telegram 中完成,现在我在 Skype 频道上工作,一切都很好,除了从 Azure Tables 保存和检索数据,我在 Azure 门户日志中收到错误 "Unknown activity type"。
您可以在下面找到我的代码:
这是主根对话框class
using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
using SimpleEchoBot.Formulário;
using Microsoft.Bot.Builder.FormFlow;
using SimpleEchoBot.Serviço;
using System.Collections.Generic;
using System.Text;
using AdaptiveCards;
using System.Threading;
namespace SimpleEchoBot.Dialogs
{
[Serializable]
public class RootDialog : IDialog<EntidadeCliente>
{
private string nome;
private string email;
public async Task StartAsync(IDialogContext context)
{
if (context.Activity.ChannelId == "telegram")
{
context.Wait(TelegramAsync);
}
else if (context.Activity.ChannelId == "skype")
{
context.Wait(SkypeAsync);
}
else
{
context.Wait(MessageReceivedAsync);
}
}
private async Task SkypeAsync(IDialogContext context,
IAwaitable<IMessageActivity> result)
{
context.Call(new NomeDialog(), NomeDialogResumeAfter);
}
private async Task NomeDialogResumeAfter(IDialogContext
context,IAwaitable<string> result)
{
try
{
nome = await result;
BuscarDadosAzure buscarDadosAzure = new BuscarDadosAzure();
EntidadeCliente cliente = new EntidadeCliente();
GravarDadosAzure gravarDadosAzure = new GravarDadosAzure();
cliente = buscarDadosAzure.PesquisarAtendimento(nome);
gravarDadosAzure.GravarDados(context, cliente);
await context.PostAsync($"Agora que já nos conhecemos { nome }, quais
seriam as informações poderia lhe ajudar?");
context.Wait(MessageReceivedAsync);
}
catch (TooManyAttemptsException)
{
await context.PostAsync("Me desculpe, não consegui registrar o seu
nome, agradecemos a sua visita.");
context.EndConversation(EndOfConversationCodes.UserCancelled);
}
}
}
这class将数据保存到Azure
public class GravarDadosAzure
{
public EntidadeCliente GravarDados(IDialogContext context,
EntidadeCliente cliente)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString2"));
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
Microsoft.WindowsAzure.Storage.Table.CloudTable table =
tableClient.GetTableReference("Usuario");
TableOperation insertOperation =
TableOperation.InsertOrReplace(cliente);
table.Execute(insertOperation);
return cliente;
}
这 Class 从 Azure 检索数据。
public EntidadeCliente PesquisarAtendimento(EntidadeCliente cliente,
[Optional] string
ConversationId)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString2"));
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference("Usuario");
if (ConversationId == null)
{
TableQuery<EntidadeCliente> query = new TableQuery<EntidadeCliente>
().Where(TableQuery.GenerateFilterCondition("Nome",
QueryComparisons.Equal, cliente.nome));
BuscarEntidade(table, cliente, query);
}
else
{
TableQuery<EntidadeCliente> query = new TableQuery<EntidadeCliente>
().Where(TableQuery.GenerateFilterCondition("ConversationId",
QueryComparisons.Equal, ConversationId));
BuscarEntidade(table, cliente, query);
}
return cliente;
}
我找到了解决方案,我在 Skype 中使用的一些值与我在直线中使用的相同,而该值在 Skype 中为空,这就是 Azure 不接受插入操作的原因。
我认为我的密钥(context.Activity.ChannelId + 空值)在 Azure 门户日志中生成了错误消息 "Unknown activity type"。