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 в диалоговом окне, но я бы порекомендовал инкапсулировать это в службу, которой вы можете владеть, и убедиться, что служба сериализуема, и что у вас нет ссылок на объекты, которые нельзя сериализовать.

Проверьте это для получения дополнительной информации о работе с несериализуемыми сервисами.

Другие вопросы по тегам