使用System.Data命名空间时出现Microsoft Bot Framework 500内部服务器错误

时间:2017-02-09 10:20:40

标签: c# bots botframework botbuilder

我正在尝试使用System.Data.DataTable解析会话期间附加的Excel文档,并将其复制到DataTable,以便使用BotFramefork对话框进行进一步处理。

当使用“System.Data”命名空间并且无法发送消息时,存在“500 InternalServerError”。

我已尝试从Github下面的示例使用Emulator

在本地运行它

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 个答案:

答案 0 :(得分:2)

问题是DataTable不可序列化,因此您无法在对话框中保存无法序列化的引用,因为在每次交互中都会对对话框状态进行序列化。

如果添加[NonSerialized]属性,您会看到对话框执行得很好,但这会产生其他影响。

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

不确定为什么要在对话框中使用DataTable,但我的建议是将其封装到您可以拥有的服务中,并确保该服务可序列化为您不能保留的服务对事物的引用无法序列化。

检查this以获取有关处理非可序列化服务的更多信息。