2009-03-26 7 views
6

Teraz bawię się przy użyciu WebServices, korzystając ze środowiska .NET (pliki .asmx, nie WCF). Zastanawiam się, jaka jest najlepsza praktyka, aby poinformować użytkownika, że ​​w wywołaniu metody wystąpił błąd biznesowy.Najlepsze praktyki dotyczące obsługi błędów w serwisie WWW

Mój mały test-case:

mam sondy, które muszą zarejestrować się w centralnym serwerze pomiaru. Każda sonda powinna mieć inny adres fizyczny. Aby się zarejestrować, należy nazywają (poprzez serwis WWW):

[WebMethod] 
public void RegisterReadingStation(out Guid sessionId, Int64 physicalAddress) 

Teraz podpis nie jest ustawione w kamieniu - faktycznie, to co staram się wymyślić. :) Muszę jakoś zaalarmować sondę, jeśli próbuje się zarejestrować przy użyciu fizycznego adresu, który już jest zajęty.

Tak jak ja to widzę, mam kilka możliwości:

  • rzucać SoapException zawierającą informacje. Jednak wiadomość typu string :: message nie jest tak łatwa do automatyzacji.
  • Użyj pewnego rodzaju klasy wartości jako parametru powrotu (lub jeszcze prostszego, wyliczenia). Jeśli to zrobię, wydaje mi się, że musiałem ręcznie serializować/deserializować klasę na serwerze/kliencie?

Jakieś przemyślenia na ten temat?

Odpowiedz

1

Myślę, że wspólnym concensus byłoby użyć niestandardowego kodu powrotu (integer). Dopóki usługa dokumentuje, jakie są możliwe kody powrotu, powinno to być wykonalne.

+0

Eek, powrót do C-dni. Problem z tym podejściem polega na tym, że nie jest zbyt elastyczny. Nie można dodawać niestandardowych komunikatów o błędach, takich jak komunikat stacktrace lub wiadomość, lub ... Widzę, że byłby to łatwy i kompatybilny sposób. – cwap

+0

Mam nabyte uznanie dla usług internetowych, które zbłądzą w stronę prostoty. –

+0

Chociaż nie jest to najwyższa głosowana odpowiedź, zaakceptuję ją. Podoba mi się aspekt "Webservices powinien być prosty w użyciu", więc to na co ja się teraz bierzę :) – cwap

5

Zwracam małą klasę o nazwie ResultSet z każdego WebMethod, który zawiera kod błędu int i błąd ciągów znaków.

Daje to możliwość łatwego sprawdzenia błędu/powodzenia i pewne szczegóły, jeśli coś pójdzie nie tak.

Jeśli WebMethod musi zwrócić dane, dziedziczę z ResultSet, aby nadać konkretny zestaw wyników, aby również uwzględnić dane.

+0

Tak, to było, gdy ja też zmierzałam :) – cwap

+0

Ale co zrobić, gdy funkcja usługi sieciowej ma zwrócić obiekt taki jak employeeData, gdy wszystko pójdzie dobrze i powinien zwrócić komunikat o błędzie w przypadku błędu. Jak zwrócić dwa różne obiekty z tej samej funkcji w innym scenariuszu? –

+0

To, co zrobiłem, to utworzenie nowej klasy o nazwie EmployeeDataResultSet, która dziedziczy z ResultSet. Następnie dodałem właściwość do EmployeeDataResultSet, która jest klasą EmployeeData. Zasadniczo hermetyzuje dane pracownika w zestawie wyników. – Moose