Лучшие практики клиентской архитектуры WCF: обобщенная обработка ошибок - PullRequest
0 голосов
/ 09 апреля 2019

Я работаю над внешним мобильным приложением для проекта. Серверная часть обрабатывается кем-то другим. На протяжении всего моего приложения я делаю запросы к серверу для информации.

Я использую svcutil.exe для получения автоматически сгенерированного клиентского прокси. В настоящее время я использую глобальный одноэлементный сервис для предоставления прокси (чтобы один и тот же прокси использовался во всем приложении для вызовов сервера).

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

// Pseudocode
T Call<T>(Expression<Func<T>> myMethod){
  // check internet connection (return if no internet)

  // check proxy state and open it if necessary

  // surround call with try catch
  // if caught exception, report to online logging service
}

// called something like this
ExampleService _proxy;

var serverValue = wcfCallManager.Call( () =>
  _proxy.GetValue(userInfo, stringQuery, settings) ); 

Я недавно заглянул в WCF и нашел:

  • «Проверка значения свойства ICommunicationObject.State является условием гонки и не рекомендуется» (https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/accessing-services-using-a-client)
  • Мне нужно закрыть / отменить прокси после завершения / сбоя вызовов.
  • Бэкэнд-разработчик хочет иметь возможность отправлять конечную точку (клиент вызывает основную конечную точку и возвращает URL) и иметь клиентское подключение к этой конечной точке.
  • мой код выглядит довольно некрасиво

В моей голове новый код будет выглядеть так:

public string PerformQuery(string query, string url){
  //checks if proxy with url exists and sends that or creates a new one
  var proxy = _proxyGetter.GetProxy(url);

  //performs query with error handling/logging
  var queryResult = wcfCallManager.Call( () =>
    proxy.GetValue(userInfo, stringQuery, settings)); 

  // translates queryResult into usable format.
  return _wcfDataFormatter.FormatQueryResult(queryResult);
}

Итак, мои вопросы:

  • Где я могу закрыть канал прокси? (некоторые вызовы могут быть одновременными или вызовы могут быть частью большой партии вызовов, поэтому я не хочу закрывать канал во время выполнения другого вызова. Также я не хочу постоянно закрывать / открывать, потому что это сделает его медленный)
  • Как отобразить сообщения об ошибках для пользователя? (обработка ошибок только журналы, я действительно не хочу, чтобы у пользователя было 15 всплывающих окон, когда мои 15 асинхронных вызовов терпят неудачу одновременно)
  • Эти практики вообще в порядке? Есть ли лучшее решение?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...