[C#] WebService standaard exceptie afhandeling

Pagina: 1
Acties:

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Momenteel ben ik bezig met een WebService welke mijn business logica aanbiedt. Veel web methods zien er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
[WebMethod]
public OrderInfo GetById(int orderId)
{
    try
    {
        return order.GetById(orderId);
    }
    catch (Exception ex)
    {
        throw GetSoapException(ex);
    }
}
Dit wil ik eigenlijk refactoren, maar elke method heeft weer een andere signature.

Hoe kan ik dit het beste aanpakken? Is er iets mogelijk met anonymous methods?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:31
Hoe kan je wat best aanpakken ?
Je zegt wat je nu hebt, maar je zegt niet waar je naartoe wil. Dan is het een beetje onmogelijk om iets zinnigs te zeggen.

https://fgheysels.github.io/


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oo, sorry. Ik wil bovenstaande code eigenlijk refactoren, aangezien dit stukje code zeer vaak voorkomt maar nagenoeg steeds hetzelfde is. Refactoren naar iets als dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
[WebMethod]
public InfoObject GeneralMethod(method)
{
    try
    {
        return method.Invoke();
    }
    catch (Exception ex)
    {
        throw GetSoapException(ex);
    }
}

Ik wil niet per WebMethod steeds die try-catch hebben, aangezien dat het geheel niet duidelijker maakt en dubbele code geeft. Maar het probleem is dat de aanroep binnen het try-block niet generiek is, het is steeds een andere method binnen de business laag en heeft ook verschillende signatures.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 21-02 17:46
Op een gegeven moment heeft refactoren geen zin meer. Je gaat het je alleen maar moeilijk maken.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Begon al zoiets te vermoeden.

Is het binnen een .NET WebService ook een globale exceptie handler te vinden?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 21-02 17:46
Als je echt wilt om exceptions allemaal hetzelfde af te handelen gaat het wel hoor.

Wat je can doen is een soort command pattern implementeren. Hoe? Wel je maakt voor elke WebMethod een class aan. Die class is dan verantwoordelijk om één bepaalde methode voor te stellen.

Bijvoorbeeld

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface ICommand{
void Execute()
}

public class GetOrderByIdCommand : ICommand{

public Order _order;
public int _orderID;
public Order _result;

public void Execute(){
      _result = _order.GetById(_orderID);
}



}


[WebMethod]
public OrderInfo GetById(int orderID){
  GetOrderByIdCommand command = new GetOrderByIdCommand();
  //command (al de parameters setten)
  WebMethodExecuteion.Execute(command);
  return command._result;
}



Dat is pseudo-code en ongeveer wat het command pattern zou moeten zijn. Ken het niet uit mijn hoofd dus zoek dat nog even op in google.

Nadeel is dat je nog heel wat classen bij creëert. Voordeel is dat al de exceptionhandling hetzelfde is.

Hier staat een veel betere uitleg
http://www.dofactory.com/Patterns/PatternCommand.aspx

[ Voor 5% gewijzigd door Vedett. op 14-03-2006 15:10 ]


Verwijderd

Ik weet natuurlijk niet wat je precies doet in GetSoapException(), maar voor de volledigheid meld ik even dat het niet nodig is om in een WebService-method je excepties zelf te "encapsuleren" in een SoapException. Het ASP.NET framework doet dat voor je.

Als je in GetSoapException() nog iets anders doet dan alleen de exceptie te encapsuleren, dan is het misschien handig om een SoapExtension te maken i.p.v. je huidige aanpak met een catch-block in al(?) je web-methods.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Het doel is dat ik voor bepaalde (eigen) exceptie's die er optreden informatie (XML) toevoeg aan de SoapException, zodat op de client meer informatie beschikbaar is dat de huidige informatie die in de SoapException zit.
Verwijderd schreef op dinsdag 14 maart 2006 @ 21:44:
[..]Als je in GetSoapException() nog iets anders doet dan alleen de exceptie te encapsuleren, dan is het misschien handig om een SoapExtension te maken i.p.v. je huidige aanpak met een catch-block in al(?) je web-methods.
Heb je daar misschien een voorbeeldje van?

[ Voor 47% gewijzigd door jelmervos op 15-03-2006 16:10 ]

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Kaassoevlee schreef op woensdag 15 maart 2006 @ 16:05:
Het doel is dat ik voor bepaalde (eigen) exceptie's die er optreden informatie (XML) toevoeg aan de SoapException, zodat op de client meer informatie beschikbaar is dat de huidige informatie die in de SoapException zit.

[...]
Heb je daar misschien een voorbeeldje van?
Daar is een SoapExtension uitermate geschikt voor. Ik heb niet zo snel een voorbeeldje bij de hand, maar de sample code (TraceExtension) die bij de MSDN-documentatie van SoapExtension staat, moet je op het goed spoor kunnen zetten.
Het komt er op neer dat je een class maakt, die erft van de SoapExtension class en waarin pre- en/of post-processing van SOAP-messages mogelijk is.
Pagina: 1