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

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

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

Метод веб-сервиса WCF:

public bool Read() { if (IsUserValid() == false) { throw new Exception("Authorized user"); } } 

На стороне клиента

 try { _client.Read(); } catch (Exception e) { MessageBox.Show(e.Message); return; } 

Результат: всегда высылайте сообщение об ошибке как исключение ** т.е.

«System.ServiceModel.FaultException: сервер не смог обработать запрос из-за внутренней ошибки. Для получения дополнительных сведений об ошибке включите IncludeExceptionDetailInFaults (либо из ServiceBehaviorAttribute, либо из поведения конфигурации) на сервере, чтобы отправить информацию об исключении для клиента или включить трассировку в соответствии с документацией Microsoft .NET Framework 3.0 SDK и проверить журналы трассировки сервера ».

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

Пожалуйста, предложите

В WCF вы не должны бросать стандартные исключения .NET – это противоречит потенциально совместимой природе WCF. В конце концов, ваш клиент может быть Java или PHP-клиентом, который не имеет понятия об исключениях .NET.

Вместо этого вам нужно выкинуть FaultExceptions (что является стандартным поведением для WCF).

Если вы хотите передать больше информации о том, что пошло не так, посмотрите на общие FaultException :

SERVER:

 public bool Read() { if (IsUserValid() == false) { throw new FaultException("User invalid"); } } 

Или, альтернативно (как было предложено @MortenNorgaard):

 public bool Read() { if (!IsUserValid()) { InvalidUserFault fault = new InvalidUserFault(); FaultReason faultReason = new FaultReason("Invalid user"); throw new FaultException(fault, faultReason); } } 

КЛИЕНТ :

 try { _client.Read(); } catch (FaultException e) { MessageBox.Show(e.Message); return; } 

Вы должны объявить свой InvalidUserFault как контракты данных WCF и определить, какие участники могут вернуться с этим типом (например, код ошибки, сообщение об ошибке и т. Д.).

  [DataContract] [Serializable()] public class BusinessFault { ... add your fault members here } 

И тогда вы должны украсить свои методы обслуживания возможными ошибками, которые он может бросить:

 [FaultContract(typeof(InvalidUserFault)] [OperationContract] public bool Read() ..... 

Конечно, «quick’n’dirty» взлома – это просто определить, что сервер возвращает детали исключений в своих FaultExceptions:

      

и затем вы можете проверить FaultException’s .Detail для фактического исключения, которое произошло на сервере, но опять же: это скорее только взлом, а не реальное решение.

Марк

Чтобы заставить это работать, вам нужно сделать две вещи:

  • Определите контракт о неисправности в интерфейсе (договор WCF)
  • Выбросить исключение как исключение сбоя
Interesting Posts

Уведомление о облачных сообщениях Firebase, которое не получено устройством

Как добавить родную библиотеку в Tomcat?

Double.TryParse или Convert.ToDouble – что быстрее и безопаснее?

Список типов mime-дисков Google Диска?

Как найти совместимую материнскую плату для моего компьютера?

Задача производительности C ++: целое число для преобразования std :: string

Как получить доступ к просмотру вкладок при использовании современного пользовательского интерфейса Internet Explorer?

Как загрузить систему Linux без графического сервера

Можно ли преобразовать существующую установку Firefox в ESR без переустановки?

Сравнение строк в Java

Производительность математических математических библиотек Java?

Помещение нескольких строк на графе Excel

Восстановление данных с SD-карты

ASP.Net MVC Html.HiddenFor с неправильным значением

Могу ли я подключить два беспроводных маршрутизатора к беспроводной сети?

Давайте будем гением компьютера.