2017-02-09 18 views
0

Я пытаюсь использовать System.Data.DataTable для разбора документа Excel, прикрепленного во время разговора, и скопировать его в DataTable для дальнейшей обработки с использованием диалоговых окон BotFramefork.Microsoft Bot Framework 500 Внутренний сервер Ошибка при использовании пространства имен System.Data

Существует «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()); 
    } 

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

ответ

2

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

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

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

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

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

+1

Спасибо @EzequielJadib за информацию. Это полезно :-) – user2092402

+0

Я вызываю новый процесс «System.Diagnostics.ProcessStartInfo» со сценарием оболочки и пытается перенаправить его на разговор с помощью OutputDataReceived. @Ezequiel Можете ли вы предложить PLZ, как я могу это достичь. Ранее я сделал это с выходом WPF C#, перенаправленным в текстовое поле. Заранее спасибо. – user2092402

+0

Ммм ... вам, возможно, придется искать ProactiveMessages ... см. Https://github.com/MicrosoftDX/botFramework-proactiveMessages –