Bot Framework снова вызывает конструктор объекта между диалогами - PullRequest
1 голос
/ 19 марта 2020

Привет всем, извините, я впервые пишу вопрос, так как я не смог найти решение. Я создаю чат-бота в MS-Bot Framework и пытаюсь передать объект «Проект» в другое диалоговое окно:

return await stepContext.BeginDialogAsync(nameof(searchProject2), new Project(new string[]{"ixnID"}, new string[]{"1"}), cancellationToken);

Однако, когда я делаю это в следующем диалоговом окне, после ввода сообщения в TextPrompt, бот немедленно аварийно завершает работу и возвращает ошибку NullReferenceException:

     [OnTurnError] unhandled error : Object reference not set to an instance of an object.
System.NullReferenceException: Object reference not set to an instance of an object.
   at ixnChatbot.Project..ctor(String[] rawFields, String[] values) in C:\Users\a\ixnChatbot\Models\Project.cs:li
ne 24
   at lambda_method(Closure , Object[] )
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectUsingCreatorWithParameters(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ObjectConstructor`1 cr
eator, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonPro
perty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract,
JsonProperty containerMember, Object existingValue) .............

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

protected readonly int ixnID;
private Dictionary<string, int> fields = new Dictionary<string, int>();
private string[] values;

protected string fieldGetterQueryWholeTable
    = "SELECT COLUMN_NAME FROM information_schema.columns WHERE table_name in('IXN_database_entries')";
protected string searchQuery;

public Project(string[] rawFields, string[] values)
{
    this.values = values;

    for (int i = 0; i < rawFields.Length; i++)
    {
        fields.Add(rawFields[i], i);
    }

    ixnID = Int32.Parse(values[fields["ixnID"]]);
    searchQuery =
        "SELECT * FROM IXN_database_entries i WHERE i.ixnID = " + ixnID;
}

Вот шаг водопада, в котором он используется. Как вы можете видеть, я не касался передаваемого объекта:

private async Task<DialogTurnResult> oneAsync(WaterfallStepContext stepContext,
    CancellationToken cancellationToken)
{ 
    var promptOptions = new PromptOptions { Prompt = MessageFactory.Text("What would you like to know about this project?") };
    return await stepContext.PromptAsync(nameof(TextPrompt), promptOptions, cancellationToken);
}

private async Task<DialogTurnResult> twoAsync(WaterfallStepContext stepContext,
    CancellationToken cancellationToken)
{
    await stepContext.Context.SendActivityAsync(stepContext.Result.ToString());
    return await stepContext.ReplaceDialogAsync(InitialDialogId, null, cancellationToken);
}

Ошибка происходит между этими двумя шагами водопада. Я смог отладить и обнаружить, что по какой-то причине бот повторно вызывал конструктор в классе Project, но во второй раз он называется списком «rawField», передаваемым в качестве параметра, равным нулю, и именно поэтому он выдает эту ошибку NullReference.

У меня вопрос, как мне остановить это от фреймворка? Я не понимаю, почему передача объекта вызывает такую ​​ошибку, и она не возникает при использовании примитивных типов, таких как строки. Я искал некоторое время и не нашел никаких вопросов, подобных этому. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 19 марта 2020

Так что я нашел решение (к сожалению) на случай, если кто-нибудь когда-нибудь столкнется с этой проблемой.

Я просто добавил пустой конструктор в класс Project, чтобы при его вызове не было нулевой ошибки в его классе. параметры.

public Project()
    {

    }

Это также сработало:

[JsonConstructor]
private Project()
{

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...