Ниже приведен фрагмент пользовательского действия рабочего процесса 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), и по какой-то причине система отключается и завершает действие, но я понятия не имею, почему это произойдет.