Obsługa błędów w webservice

0

Cześc wam, jak mogę zrobić obsługę błędów w webservicie tak aby błędy były wyświetlane w aplikacji klienckiej? Przypuśćmy, że coś zostało źle wpisane, jakieś złe dane i na poziomie webservice bez problemu mogę to wyświetlić ale jak to zrobić po stronie aplikacji klienckiej (2 oddzielne solucje).

1

Przechwycić wyjątek, zserializowować i przesłać do klienta. Przydaje się do tego jakiś generyczny typ Response z właściwościami typu IsError, ErrorMessage, który stanowi kontrakt tego serwisu i jest znany klientowi.

0

A mógłbyś to jakoś kodem rozrysować? Bo nie bardzo sobie wyobrażam jak to ma wyglądać. Z góry dzięki

4

W starych WebService nie da się tego elegancko zrobić przynajmniej ja nie znam sposobu, natomiast w WCF wyglądało by to mniej więcej tak:
Serwis:

#region

using System;
using System.Net;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;

#endregion

namespace WebService
{
   [ServiceContract]
   public interface IFoo
   {
      [OperationContract]
      [FaultContract(typeof(ErrorData))]
      void DoWork();
   }

   [DataContract]
   public class ErrorData
   {
      public ErrorData(string errorCode, string errorMessage)
      {
         ErrorCode = errorCode;
         ErrorMessage = errorMessage;
      }

      [DataMember]
      public string ErrorCode { get; set; }

      [DataMember]
      public string ErrorMessage { get; set; }
   }

   public class Foo : IFoo
   {
      public void DoWork()
      {
         try
         {
            // 010011100110000101110000011010010110010101110010011001000
            // 1111010011010010110010101101100011000010110110100100000011
            // 1010001100001011100110110101101101001001011100010111000101
            // 110
            // ...
            throw new ArgumentException("Jakiś tam argument. Jakiś tam powód.");
         }
         catch (ArgumentException ex)
         {
            throw new FaultException<ErrorData>(new ErrorData("ErrorCode - 123", "Jakiś szczegółowy opis."), new FaultReason(ex.Message));
            // Jak to jest REST WCF to możesz użyć WebFaultException<T> i zwracać HttpStatusCode
         }
         
      }
   }
}

Klient:

namespace Test
{
   internal class Program
   {
      private static void Main(string[] args)
      {
         try
         {
            var fooClient = new FooClient();
            fooClient.DoWork();
         }
         catch (FaultException<ErrorData> ex)
         {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.Detail.ErrorMessage);
         }
      }
   }
}

Klient output:
''Jakis tam argument. Jakis tam powód.
Jakis szczególowy opis.''

0

Dzięki za odp. Nie ma u mnie w web service czegoś takiego jak faultException lub WebFaultException. Jak mogę inaczej to ugryźć?

0

Mam ogólnie pewien problem bo nie udaje mi się wyświetlić błędu. Dodam, że to są 2 oddzielne projekty. Z aplikacji klienckiej mam referencję do web service żeby mieć dostęp do klasy ErrorHandler. Przy złapaniu błędu po stronie web servica wyskakuje coś takiego An exception of type 'System.ServiceModel.FaultException`1' occurred in ServiceLibrary.dll but was not handled in user code (Ten kod jest w serviceLibrary)

            sql = new SqlConnection(@"XXXXXXXXXXXXXXXXXXXXXXX");

            try
            {
                sql.Open();
                return true;
            }
            catch (Exception ex)
            {
                throw new FaultException<ErrorHandler>(new ErrorHandler("3", "Cos sie wyjebalo na polaczeniu"), new FaultReason(ex.Message));
            }

Po stronie klienta mam takie coś

            try
            {
                ServiceReference.WebServiceSoapClient abc = new ServiceReference.WebServiceSoapClient();
                abc.metoda();
            }
            catch(FaultException<ServiceLibrary.ErrorHandler> ex)
            {
                MessageBox.Show(ex.Detail.ErrorDescription);
            }

Może mnie nakierować czego nie ogarnąłem?

0

Ponieważ rzucasz ten wyjątek dalej do klienta więc jak masz WebService odpalony pod Debugiem to VS zatrzyma ci się w tym miejscu, standardowe zachowanie VS. Dopiero klient po swojej stronie będzie obsługiwał ten wyjątek. Więc wszystko jest w porządku według mnie. :)

0

Według ciebie jest w porządku a według kodu nie obsługuje błędów po stronie klienta haha. Może zadam następne pytanie odnośnie tego debugowania, w jaki sposób umieścić i włączyć web service na jakimś hoście? Lub jak odpalić web service w trybie NIE debugowania bo w ten sposób sie nigdy nie dowiem czy to działa

0

Opublikuj ten WCF na swoim lokalnym IISie, a debuguj tylko klienta.

0

Nie idzie, błąd najpierw na serwerze a później w kliencie i co najlepsze w try'u, nie w catchu. Nie ogarniam, to jest chyba źle zrobione

1 użytkowników online, w tym zalogowanych: 0, gości: 1