Результат вызова WCF - PullRequest
       4

Результат вызова WCF

2 голосов
/ 19 января 2011

Что было бы лучше при предоставлении клиенту wcf результата вызова.

1.Оборачивание результата в объект

   public enum DefinedResult : short {
      Success = 0,
      TimeOut = 1,
      ServerFailure = 2,
      UserNotFount = 3,
      Uknown = 4,

      //etc.
   }

   [DataContract]       
   public class ServiceResult {

       readonly DefinedResults dResult;

       public ServiceResult(DefinedResult result) {

            this.dResult = result;
      }
      [DataMember]
      public bool IsSuccess 
      {
          get {return this.dResult == DefinedResult.Success;}
      }

   }



  //Client:

  WcfClient client = new WcfClient();
  ServiceResult result = client.DoWork();

2.Создание пользовательского исключения:

  [Serializable]
  public UserNotFoundException: Exception {

        public UserNotFoundException(string message): base(message) {}

  }


  //client:
  WcfClient client = new WcfClient();
  try {
    result = client.DoWork();
  }
  catch(FaultException<ExceptionDetail> ex) {

      switch(ex.Detail.Type) 
      {
          case "MyCompany.Framework.Exceptions.UserNotFound":
             //handle
             break;
          case "MyCompany.Framework.Exceptions.ServerError":
             //handle
             break;
      }
  }

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

Ответы [ 2 ]

4 голосов
/ 19 января 2011

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

Создание пользовательского класса исключений:

[DataContract] 
class MyException : FaultException<mydetails>

Определите, что ваш сервис выбрасывает:

[FaultContract(...)] 
void mymethod()...

throw MyException в вашем методе обслуживания

Тогда вы можете перехватить ваше исключение в методе обслуживания, например catch FaultException<mydetails>

Это самый хороший способ.

1 голос
/ 19 января 2011

Исключения FaultException поглощаются WebHttpBinding (требуется для служб JSON / REST). В этом случае, если вы хотите предоставить подробную информацию своему клиенту, лучше использовать вариант 1.

Если JSON не мешает, я бы порекомендовал вариант 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...