Microsoft Bot Framework 500 Внутренняя ошибка сервера при использовании пространства имен System.Data
Я пытаюсь использовать System.Data.DataTable, чтобы проанализировать документ Excel, прикрепленный во время разговора, и скопировать его в DataTable для дальнейшей обработки с использованием диалоговых окон BotFramefork.
Существует "500 InternalServerError", когда пространство имен "System.Data" используется и не может отправить сообщение.
Я попробовал на примере ниже с Github, чтобы запустить его локально с эмулятором
https://github.com/jamesemann/intro-to-botframework5-dialogsrefactored
Для того же примера, если включен "System.Data.DataTable", в эмуляторе имеется 500 внутренних ошибок сервера.
[Serializable]
public class AdditionDialog : IDialog<object>
{
protected int number1 { get; set; }
/* Error When Included Below line*/
System.Data.DataTable dt = new System.Data.DataTable();
public async Task StartAsync(IDialogContext context)
{
await context.PostAsync("Provide number one:");
context.Wait(MessageReceivedAddNumber1);
}
public async Task MessageReceivedAddNumber1(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var numbers = await argument;
// number one is persisted between messages automatically by bot framework dialog
this.number1 = int.Parse(numbers.Text);
await context.PostAsync("Provide number two:");
context.Wait(MessageReceivedAddNumber2);
}
public async Task MessageReceivedAddNumber2(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var numbers = await argument;
var number2 = int.Parse(numbers.Text);
await context.PostAsync($"{this.number1} + {number2} is = {this.number1 + number2}");
context.Done<object>(new object());
}
Может кто-нибудь предложить, если я что-то здесь упускаю.
1 ответ
Проблема в том, что DataTable
не является сериализуемым, и, таким образом, вы не можете содержать ссылку в диалоге для чего-то, что не может быть сериализовано, потому что в каждом взаимодействии состояние диалога сериализуется.
Если вы добавите [NonSerialized]
Атрибут вы увидите, что диалог выполняется очень хорошо, однако это будет иметь другие последствия.
[NonSerialized]
System.Data.DataTable dt = new System.Data.DataTable();
Не уверен, почему вы пытаетесь использовать DataTable
в диалоговом окне, но я бы порекомендовал инкапсулировать это в службу, которой вы можете владеть, и убедиться, что служба сериализуема, и что у вас нет ссылок на объекты, которые нельзя сериализовать.
Проверьте это для получения дополнительной информации о работе с несериализуемыми сервисами.