Клиент WPF - Должен ли я звонить в службу WCF в фоновом потоке?

У меня есть клиент WPF, который делает вызовы 2 служб WCF.

Один сервис предназначен только для запросов, а другой - для команд ( шаблон CQS).

Как мне сделать звонки в службу команд?

Я где-то читал, что все операции в службе команд должны быть односторонними, потому что они не должны возвращать никаких значений. И что если что-то пошло не так - операция должна выдать "FaultException" клиенту.

Но если все команды односторонние - что мне делать в клиенте?

Скажем, у меня есть окно "AddProduct" в клиенте WPF, и я ввожу информацию и нажимаю "Сохранить".

Я сейчас называю "AddProduct(Product)" в сервисе, но:

  1. Должно ли это закрыть окно?
  2. Стоит ли ждать 10 секунд, чтобы увидеть, не было ли какого-либо исключения FaultException?
  3. Разве операция не должна быть односторонней? Если это так - должны ли все операции в службе команд возвращать некоторый тип общего объекта "Результат" с "успешно" или "с ошибкой"?
  4. Если в разделе 3 указано "Да", следует ли мне вызывать службу в отдельном потоке и "отключать" все элементы управления в окне, пока я не получу ответ от службы?

Благодарю.

2 ответа

Решение

Я бы сказал, что вариант 3 - это путь, но вам, вероятно, не нужен общий Result объект для сообщения об ошибках клиенту. Как вы, возможно, знаете, исключения не сериализуются в сообщении SOAP, поэтому вы не получите никаких обычных исключений.NET на стороне клиента. С другой стороны, вы все еще можете воспользоваться ошибками SOAP, перехватив FaultException на клиенте. Соответственно, если на клиенте не было обнаружено никаких исключений, то все прошло хорошо.

Для получения дополнительной информации об исключениях ошибок и о том, как вы можете использовать их в своих интересах, ознакомьтесь с:

Определение и обработка ошибок в контрактах и ​​услугах

Я думаю, что использование On-Way - это хорошо, но вы должны знать о некоторой характеристике одностороннего вызова. Если вы заботитесь и можете обрабатывать сервисные исключения, тогда #4 - хороший вариант.

Одностороннее сообщение - как только клиент выполняет вызов, WCF генерирует сообщение запроса, но никакое коррелированное сообщение никогда не будет возвращено клиенту. Любые исключения, возникшие на стороне службы, не будут доступны клиенту.

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

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

Если существует транспортный сеанс - исключение на стороне службы вызовет сбой канала, следовательно, клиент не сможет повторно использовать прокси для отправки большего количества вызовов. Это может дать вам возможность обнаружить, что что-то пошло не так на стороне сервера (но не то, что пошло не так). Хотя, если служба использует FaultContracts, вы все равно можете попасть в ситуацию, когда клиент не знает, что что-то пошло не так.

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

Другие вопросы по тегам