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).
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.
A mógłbyś to jakoś kodem rozrysować? Bo nie bardzo sobie wyobrażam jak to ma wyglądać. Z góry dzięki
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.''
Dzięki za odp. Nie ma u mnie w web service czegoś takiego jak faultException lub WebFaultException. Jak mogę inaczej to ugryźć?
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?
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. :)
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
Opublikuj ten WCF na swoim lokalnym IISie, a debuguj tylko klienta.
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