2009-07-22 10 views
0

Ich verwende die Enterprise Library Validation Application Block für meine WCF-Dienst. Alles ist in Ordnung, und .Net-Benutzer können die FaultException<ValidationFault>-Ausnahme abfangen, um eine Sammlung von lesbaren Geschäftsfehlern zu erhalten. Es sieht jedoch nicht so gut aus für Nicht-.Net-Konsumenten, besonders für jene, die die rohe SOAP-Nachricht betrachten werden. Der SOAP-Reason-Text lautet immer "Der Ersteller dieses Fehlers hat keinen Grund angegeben." Dies ist nicht sehr hilfreich, da ein Grund ist, der unter dem <Detail>-Element angegeben ist, wie in der Beispielfehlermeldung gezeigt unten.WCF EntLib Validierung - ändern Standard SOAP Fault Reason Text

Gibt es eine Möglichkeit, den Text zu ändern „Der Schöpfer dieses Fehlers keinen Grund angegeben hat.“ zu etwas nützlich wie „See ValidationFault Einzelheiten“?

<s:Body> 
    <s:Fault> 
     <s:Code> 
     <s:Value>s:Sender</s:Value> 
     </s:Code> 
     <s:Reason> 
     <s:Text xml:lang="en-GB">The creator of this fault did not specify a Reason.</s:Text> 
     </s:Reason> 
     <s:Detail> 
     <ValidationFault xmlns="http://www.microsoft.com/practices/EnterpriseLibrary/2007/01/wcf/validation" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
      <Details xmlns:b="http://schemas.datacontract.org/2004/07/Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF"> 
       <b:ValidationDetail> 
        <b:Key i:nil="true"/> 
        <b:Message>Value Validator</b:Message> 
        <b:Tag>request</b:Tag> 
       </b:ValidationDetail> 
      </Details> 
     </ValidationFault> 
     </s:Detail> 
    </s:Fault> 
</s:Body> 
+0

Ich habe das gleiche Problem. Ich denke, es gibt keine Möglichkeit, dies mit der Enterprise-Bibliothek Validation Behaviour für WCF zu tun. – softveda

+0

yeah, ich habe das vor einiger Zeit vor den Tagen von StackOverflow untersucht und das war die Schlussfolgerung, zu der ich gekommen bin, aber ich dachte, ich würde hier posten, um nachzusehen! –

Antwort

3

Nun scheint es, wie die EntLib Menschen nicht von diesem denken hat. Ich habe festgestellt, wo die Änderung in der EntLib-Code sein muss und eine issue at their CodePlex site ausgelöst. Ich denke, dies könnte auch von jedem als Teil des Projekts EntLibContrib getan werden, aber sie scheinen immer noch auf Enterprise Library 3.1 zu sein, während ich 4.1 benutze.

Ich denke, wenn jemand verzweifelt ist, wäre die Lösung der EntLib Quellcode zum Download sein, und ändern Sie die BeforeCall Methode in der ValidationParameterInspector-Klasse (im Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF Namespace). Hier wird die FaultException erstellt. Eine Überladung zu diesem Konstruktor kann FaultReason angeben.

+1

Richtig, und das ist auch, wo Sie die 'FaultReason' aus der Konfiguration ziehen sollten. –

0

Wie generiert Ihr WCF-Dienst diese Fehler?

Wenn Sie den Blick auf FaultException Klasse in WCF, gibt es zahlreiche Möglichkeiten, wie Sie einer von denen, konstruieren können - darunter auch einige constructors die Ihnen erlauben, einen FaultReason für den SOAP-Fehler angeben.

Marc

+0

Ja, aber die EntLib-Validierung tritt vor meinem Service-Implementierungscode ein. Der Service kann Fehler behandeln, die nach der Validierung aufgetreten sind, und sie in SOAP-Fehler in Ordnung bringen, die Validierung erfolgt jedoch geringfügig vor diesem Vorgang. –

+0

In diesem Fall wird die FaultException jedoch von der Enterprise-Bibliothek und nicht explizit vom Benutzercode erstellt. – softveda

+1

Dann möchten Sie vielleicht den Enterprise-Bibliothek-Code anpassen (und es zurück beitragen). Ich würde empfehlen, den Grund von einem Konfigurationseintrag abzurufen. –