使用 System.Data 命名空间时 Microsoft Bot Framework 500 内部服务器错误
Microsoft Bot Framework 500 Internal server Error when System.Data Namespace Used
我正在尝试使用 System.Data.DataTable 解析对话期间附加的 Excel 文档,并将其复制到 DataTable 以使用 BotFramefork 对话框进行进一步处理。
当 "System.Data" 使用命名空间且无法发送消息时出现“500 InternalServerError”。
我试过下面的示例,从 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());
}
任何人都可以建议我是否遗漏了什么。
问题是 DataTable
不可序列化,因此您不能在对话框中保留对无法序列化的内容的引用,因为在每次交互中,对话框状态都会被序列化。
如果您添加 [NonSerialized]
属性,您将看到对话框执行得很好,但是这会有其他影响。
[NonSerialized]
System.Data.DataTable dt = new System.Data.DataTable();
不确定为什么要尝试在对话框中使用 DataTable
,但我的建议是将其封装到您可以拥有的服务中,并确保该服务是可序列化的,但您不持有对事物的引用不能被序列化。
查看 this 了解有关处理 non-serializable 服务的更多信息。
我正在尝试使用 System.Data.DataTable 解析对话期间附加的 Excel 文档,并将其复制到 DataTable 以使用 BotFramefork 对话框进行进一步处理。
当 "System.Data" 使用命名空间且无法发送消息时出现“500 InternalServerError”。
我试过下面的示例,从 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());
}
任何人都可以建议我是否遗漏了什么。
问题是 DataTable
不可序列化,因此您不能在对话框中保留对无法序列化的内容的引用,因为在每次交互中,对话框状态都会被序列化。
如果您添加 [NonSerialized]
属性,您将看到对话框执行得很好,但是这会有其他影响。
[NonSerialized]
System.Data.DataTable dt = new System.Data.DataTable();
不确定为什么要尝试在对话框中使用 DataTable
,但我的建议是将其封装到您可以拥有的服务中,并确保该服务是可序列化的,但您不持有对事物的引用不能被序列化。
查看 this 了解有关处理 non-serializable 服务的更多信息。