Ошибка внутреннего сервера 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());
    }

Может ли кто-нибудь предложить, если я что-то пропустил здесь.


person user2092402    schedule 09.02.2017    source источник


Ответы (1)


Проблема в том, что DataTable не является сериализуемым, и поэтому вы не можете хранить в диалоге ссылку на что-то, что не может быть сериализовано, потому что при каждом взаимодействии состояние диалога сериализуется.

Если вы добавите атрибут [NonSerialized], вы увидите, что диалоговое окно выполняется нормально, однако это будет иметь другие последствия.

[NonSerialized]
System.Data.DataTable dt = new System.Data.DataTable();

Не уверен, почему вы пытаетесь использовать DataTable в диалоговом окне, но я бы порекомендовал инкапсулировать это в службу, которой вы можете владеть, и убедиться, что служба сериализуема, а вы не храните ссылки на вещи, которые не могут быть сериализованы.

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

person Ezequiel Jadib    schedule 09.02.2017
comment
Спасибо @EzequielJadib за информацию. Это полезно :-) - person user2092402; 09.02.2017
comment
Я вызываю новый процесс System.Diagnostics.ProcessStartInfo с помощью сценария оболочки и пытаюсь перенаправить его на диалог с помощью OutputDataReceived . @Ezequiel Можете ли вы предложить, как мне этого добиться. Ранее я делал это с выводом WPF c#, перенаправленным в текстовое поле. Заранее спасибо. - person user2092402; 10.02.2017
comment
Ммм... возможно, вам придется обратиться к ProactiveMessages... см. github.com/MicrosoftDX/botFramework-proactiveMessages - person Ezequiel Jadib; 10.02.2017