FaultExceptionとFaultException <T>を使用して、私たちのアプリケーションで最良の使用パターンを調べることを試しています。 SOAP 1.1とSOAP 1.2クライアントを含むWCF以外のサービスコンシューマ/クライアントと同様に、WCFをサポートする必要があります。.NET WCFのフォールトが不正なSOAP 1.1フォルトコード値を生成しています
FYI:wsHttpBindingでFaultExceptionsを使用するとSOAP 1.2セマンティクスになり、basicHttpBindingでFaultExceptionsを使用するとSOAP 1.1セマンティクスになります。
私はFaultException <FaultDetails>投げるために、次のコードを使用しています:
throw new FaultException<FaultDetails>(
new FaultDetails("Throwing FaultException<FaultDetails>."),
new FaultReason("Testing fault exceptions."),
FaultCode.CreateSenderFaultCode(new FaultCode("MySubFaultCode"))
);
FaultDetailsクラスには、以下を参照してくださいすることができますよう、文字列「メッセージ」プロパティが含まれているだけの簡単なテストクラスです。
応答をwsHttpBinding使用している:これは、SOAP 1.2仕様に応じて右に見える<?xml version="1.0" encoding="utf-16"?>
<Fault xmlns="http://www.w3.org/2003/05/soap-envelope">
<Code>
<Value>Sender</Value>
<Subcode>
<Value>MySubFaultCode</Value>
</Subcode>
</Code>
<Reason>
<Text xml:lang="en-US">Testing fault exceptions.</Text>
</Reason>
<Detail>
<FaultDetails xmlns="http://schemas.datacontract.org/2004/07/ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Message>Throwing FaultException<FaultDetails>.</Message>
</FaultDetails>
</Detail>
。メイン/ルート "Code"は "Sender"で、 "MySubFaultCode"の "Subcode"を持っています。サービスコンシューマ/クライアントがWCFを使用している場合、クライアント側のFaultExceptionもfaultException.Code.Nameが "Sender"、faultException.Code.SubCode.Nameが "MySubFaultCode"で、同じ構造を模倣します。
応答をbasicHttpBinding使用している:<?xml version="1.0" encoding="utf-16"?>
<s:Fault xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>s:MySubFaultCode</faultcode>
<faultstring xml:lang="en-US">Testing fault exceptions.</faultstring>
<detail>
<FaultDetails xmlns="http://schemas.datacontract.org/2004/07/ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Message>Throwing FaultException<FaultDetails>.</Message>
</FaultDetails>
</detail>
</s:Fault>
これは右見ていません。 SOAP 1.1の仕様を見ると、FaultCode.CreateSenderFaultCode(新しいFaultCode( "MySubFaultCode"))を使用すると、 "faultcode"の値が "s:Client.MySubFaultCode"になることを期待していました。また、WCFクライアントの構造が正しくありません。 faultException.Code.Nameは「Sender」ではなく「MySubFaultCode」であり、faultException.Code.SubCode.Nameが「MySubFaultCode」ではなく、faultException.Code.SubCodeがnullです。また、faultException.Code.IsSenderFaultはfalseです。
同様の問題FaultCode.CreateReceiverFaultCode(新規のFaultCode( "MySubFaultCode"))を使用する場合:SOAP 1.2
- 作品を生成Server.MySubFaultCode:代わりに「Sの「S MySubFaultCodeを」 faultException.Code.IsReceiverFaultはSOAP 1.1のfalseです。
このアイテムも2006年にhttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=669420&SiteID=1に投稿されましたが、誰も回答していません。誰もこれに就いていないと信じるのはとても難しいです。ここで
は、他の誰かが同様の問題持っている:http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3883110&SiteID=1&mode=1マイクロソフト接続をバグ:https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=367963
障害がどのように動作するかをの説明:私は何か間違ったことか、これは本当にバグであるhttp://blogs.msdn.com/drnick/archive/2006/12/19/creating-faults-part-3.aspx
アムWCFで?