2012-03-08 7 views
8

Kiedy rzucanie FaultException<CustomFault> takiego:Wyrzucenie wyjątku FaultException <T> z usługi WCF powoduje, że "Twórca tego błędu nie określił przyczyny".

throw new FaultException<CustomFault>(new CustomFault("Custom fault message")); 

uzyskać następujące: „Twórcą tego błędu nie określił powód” Teraz według this MSDN article nie jest wymagane do korzystania z FaultReason

Mam następujący Umowa serwisowa:

[OperationContract] 
[FaultContract(typeof(CustomFault))] 
CustomType[] SomeMethod(int someParameter); 

[DataContract] 
public class CustomFault 
{ 
    private string report; 

    public CustomFault(string message) 
    { 
     this.report = message; 
    } 

    [DataMember] 
    public string Message 
    { 
     get { return this.report; } 
     set { this.report = value; } 
    } 
} 

Jest komentarz na artykuł MSDN, które sugerują, obowiązkowe jest użycie drugiego FaultReason , ale w kilku innych miejscach widziałem ludzi, którzy twierdzili, że nie powinieneś używać FaultReason, chyba że jest to konieczne.

Moje pytanie jest następujące; czy jest naprawdę obowiązkowe korzystanie z FaultReason, a jeśli nie - w jaki sposób mogę zapobiec wyjątkowi podniesionemu podczas próby rzucenia FaultException?

EDIT

Uruchamiając przykładowy projekt z this article otrzymuję wykopywac zaladowanie samo zachowanie. Być może jest to spowodowane aktualizacją w .NET, a dokumentacja/próbki nie są aktualizowane.

+0

Ilekroć rzuciłem 'FaultException ' s przez WCF, nie ustawiłem 'Reason', i nie miałem problemu. Nie mogę rzucić światła na to, dlaczego to nie działa, przepraszam. – AakashM

+0

Czy otrzymujesz wyjątek podczas wywoływania usługi bez dołączonego debugera VS? –

+0

Nie, ja nie. Może to tylko kwestia nieobsługiwanych poziomów wyjątków w debugerze. Ale wydaje mi się błędne, że dokumentacja używa strategii obsługi błędów, która powoduje wyjątek :( –

Odpowiedz

9

Usterka powodem jest wymagane natomiast dane są opcjonalne.

WCF używa wartość właściwości FaultException.Reason zapełnić element <faultstring> z SOAP Fault, który jest wymagany przez the SOAP specification:

faultstring
Element faultstring ma na celu dostarczenie czytelnej wyjaśnienie usterki i nie jest przeznaczony do przetwarzania algorytmicznego . [...] MUSI być obecny w elemencie Usterka SOAP i POWINIEN podać przynajmniej niektóre informacje wyjaśniające naturę błędu .

Dlatego też, musi dostarczyć powód do winy podczas rzucania FaultException z usług WCF.

+0

To sprawia, że ​​tak się dzieje. Jednak wszystkie przykłady i dokumentacja, które znajduję w Internecie zdają się ignorować to, co powoduje, że myślę, że może być innym sposobem rozwiązania tego problemu w WCF? –

+0

Kompletny przykładowy projekt: http://msdn.microsoft.com/en-us/library/ee942778.aspx Dokumentacja klasy FaultException: http://msdn.microsoft.com/ en-us/library/ms576199.aspx –

+0

"Wydaje się, że to tylko kwestia opcji podziału wybranych w debugerze VS. –

Powiązane problemy