Я работаю над проектом, который использует несколько вызовов WCF для выполнения процедуры. Первый вызов возвращает уникальный идентификатор (Guid), который должны предоставить все следующие вызовы. На стороне сервера каждый вызов регистрируется вместе с этим уникальным идентификатором, чтобы можно было наблюдать за ходом одной процедуры (предположим, что клиент может запускать несколько из этих процедур одновременно, и они являются потокобезопасными) < / em>.
Пример на стороне клиента будет примерно таким:
string clientName = GetClientName();
Guid uniqueId = wcfClient.Begin(clientName);
object data = wcfClient.GetData(clientName, uniqueId);
object processedData = ProcessDataLocally(data);
bool success = wcfClient.confirmDataValidity(clientName, uniqueId, processedData);
// ...
wcfClient.End(clientName, uniqueId);
Если что-то пойдет не так на стороне сервера, я бы хотел, чтобы это тоже регистрировалось, используя uniqueId, присвоенный вызову, который пошел не так. С этой целью я использовал все методы службы для использования такой функции:
private T DoProcess<T>(Guid uniqueId, Func<T> process)
{
try
{
return process();
}
catch(Exception ex)
{
Log(ex, uniqueId);
throw; // or throw the same thing every time, if the client
// shouldn't know the details
}
}
public object GetData(string clientName, Guid uniqueId)
{
return DoProcess(uniqueId, () =>
{
object data;
// Generate data
return data;
});
}
Однако кажется, что это не позволяет выявить все возможные ошибки (например, если время ожидания соединения истекло).
Я читал о реализации интерфейса IErrorHandler
и его подключении к службе. Хотя это, кажется, перехватывает все ошибки, похоже, нет другого способа передать ему информацию, кроме исключения, такого как uniqueId. Следовательно, нет возможности зарегистрировать идентификатор.
Можно ли перехватить все исключения и включить данные, которые были переданы методу, в котором возникло исключение?