Невозможный результат после выполнения пользовательского действия рабочего процесса MS CRM 8.2 - PullRequest
1 голос
/ 07 апреля 2020

Ниже приведен фрагмент пользовательского действия рабочего процесса MS CRM:

[Input("Input name")]
public InArgument<string> InputName { get; set; }
private string InputNameValue
{
    get
    {
        return InputName.Get(Context);
    }
}

[Output("Success")]
public OutArgument<bool> Success { get; set; }
[Output("Result Message Details")]
public OutArgument<string> ResultMessageDetails { get; set; }

[Output("Integer result")]
public OutArgument<int> ResultInt { get; set; }

private CodeActivityContext Context { get; set; }

(...)

try
{
    ResultInt.Set(Context, -1);
    var query = new QueryByAttribute("my_customentity") { ColumnSet = new ColumnSet("my_customentityid") };
    if (!String.IsNullOrEmpty(InputNameValue))
        query.AddAttributeValue("my_name", InputNameValue);
    OutputId.Set(Context, null);

    var results = service.RetrieveMultiple(query).Entities;
    if (results.Count == 1)
    {
        OutputId.Set(Context, results.Single().ToEntityReference());

        Success.Set(Context, true);
        ResultInt.Set(Context, 1);
        ResultMessageDetails.Set(Context, "");
    }
    else
    {
        ResultInt.Set(Context, 2);
        Success.Set(Context, false);
        ResultMessageDetails.Set(Context, "Could not find the specified entity by name.");
    }
}
catch (Exception ex)
{
    ResultInt.Set(Context, 3);
    Success.Set(Context, false);
    ResultMessageDetails.Set(Context, ex.Message);
}

Обратите внимание, что код устанавливает ResultInt в -1 в первой строке. Независимо от того, что произойдет после этого, это свойство вывода всегда должно быть установлено равным 1, 2 или 3. Я подтвердил, что параметры выходного рабочего процесса можно задавать несколько раз и при необходимости перезаписывать. Также обратите внимание, что OutArgument<int> будет, по умолчанию, равным 0.

Однако, время от времени рабочий процесс завершается сбоем, и журналы показывают, что ResultInt было ... -1, и ожидаемый OutputId параметр равен нулю. Это невозможный случай также по другой странной причине - запрашиваемая запись пользовательского объекта существует в системе. Как будто этот код завершается в середине выполнения без каких-либо предупреждений. Обратите внимание, что последующие шаги рабочего процесса выполняются, как будто ничего плохого не произошло, с неверными выводами, как описано выше. Если в предложении catch было исключение, то оно должно было распространяться "вверх" и регистрироваться в CRM, предотвращая выполнение последующих шагов рабочего процесса. Когда я пишу, что «рабочий процесс потерпит неудачу», я имею в виду, что пустой результат этого пользовательского действия позже обрабатывается другим шагом, который не может использовать пустое значение.

К сожалению, у меня нет идей о том, как потенциально отладить эту проблему. Хуже всего то, что это очень странное явление, которое невозможно воспроизвести. Если это когда-либо произойдет, тогда простая «повторная попытка» даст правильный результат.

Я мог бы включить максимальную трассировку на уязвимом сервере CRM и надеюсь, что мне удастся получить что-то, что указывало бы на проблему, но я был надеясь, что кто-то еще уже видел нечто подобное. Мое лучшее предположение на данный момент состоит в том, что происходит нечто странное, когда запрос выполняется CRM (service.RetrieveMultiple call), и по какой-то причине система отключается и завершает действие, но я понятия не имею, почему это произойдет.

...