2

WCFBasic-HTTPWebサービスとして公開されている要求/応答ポートタイプのBizTalk2009オーケストレーションがあります。ポートには1つの操作があり、その操作には適切なスキーマを持つ要求メッセージと応答メッセージがあります。このポートで要求を受信した後、標準の応答メッセージの代わりに障害メッセージをクライアントに返す必要がある場合がいくつかあります。正しい障害メッセージをクライアントに返すのに問題があります。SOAP障害メッセージの要素faultcodeと要素の両方を設定できるようにしたいと思います。faultstringこれが私が試したことです:

文字列型の障害メッセージの追加:メッセージ型が文字列の障害メッセージを操作に追加してみました。オーケストレーション内で、文字列メッセージを作成し、それを応答として送信しました。クライアントに返送された障害は次のようになりました。

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <s:Fault>
         <faultcode xmlns:a="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher">a:InternalServiceFault</faultcode>
         <faultstring xml:lang="en-US">&lt;?xml version="1.0" encoding="utf-8"?>
&lt;string>This is the error message.&lt;/string></faultstring>
         <detail>
            <ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
               <HelpLink i:nil="true"/>
               <InnerException i:nil="true"/>
               <Message>&lt;?xml version="1.0" encoding="utf-8"?>
&lt;string>This is the error message.&lt;/string></Message>
               <StackTrace>at Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkAsyncResult.End() ...</StackTrace>
               <Type>Microsoft.BizTalk.Adapter.Wcf.Runtime.BizTalkNackException</Type>
            </ExceptionDetail>
         </detail>
      </s:Fault>
   </s:Body>
</s:Envelope>

これはほとんど機能しますが、faultstring要素に文字列自体ではなく、xmlシリアル化されたバージョンの文字列が含まれている点が異なります。faultcode要素も設定できません。

タイプの障害メッセージを追加するhttp://schemas.xmlsoap.org/soap/envelope/#FaultFault要素 を作成して送信した場合に予想される内容に沿って障害メッセージを返すようにBizTalkを説得できるかもしれないと思いました。そこで、タイプがの障害メッセージを追加しhttp://schemas.xmlsoap.org/soap/envelope/#Fault、適切なメッセージを作成して、それを応答として送信しました。結果は上記と同じでしたが、文字列の代わりに、faultstring要素に、CDATA私が作成したxmlメッセージ全体を含むセクションが含まれていました。

だから私は今立ち往生しています。これはBizTalkでは簡単な作業だと思います。MSDNのドキュメント「WCFサービスとして公開されているオーケストレーションから障害例外をincludeExceptionDetailInFaultsスローする方法」では、障害例外をスローできることと、構成で設定する必要があることを除いて、障害例外をスローする「方法」については何も説明されていません(終わり)。

これをBizTalk2009でどのように実現できるかについて、誰か提案がありますか?

4

2 に答える 2

2

シリアル化されたメッセージから理由テキストを読み取り、逆シリアル化された理由テキストを使用して新しいSystem.ServiceModel.FaultExceptionメッセージを返すカスタムWCF IDispatchMessageInspectorを追加することで、この正確な問題を解決しました。

BizTalkオーケストレーションでは、PortType障害メッセージタイプとしてSystem.Stringを使用します。

public class HandleUntypedSoapFault : IDispatchMessageInspector
{

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {

        if (reply.IsFault)
        {

            MessageBuffer buffer = reply.CreateBufferedCopy(int.MaxValue);
            MessageFault messageFault = MessageFault.CreateFault(buffer.CreateMessage(), int.MaxValue);

            if (!messageFault.HasDetail)
            {
                reply = buffer.CreateMessage();
                return;
            }

            using (XmlReader reader = XmlReader.Create(new StringReader(messageFault.Reason.ToString())))
            {
               reader.MoveToContent();
               string _faultText =  reader.ReadElementContentAsString();
            }

            reply = Message.CreateMessage(
                reply.Version, 
                new FaultException(
                    _faultText, 
                    new FaultCode("client")).CreateMessageFault(),
                null);
        }
    }
}

これで、SoapFaultは次のようになります。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <s:Fault>
         <faultcode>s:Client</faultcode>
         <faultstring xml:lang="en-US">An untyped SoapFault from my BizTalk orchestration. This text was set in the orchestration.</faultstring>
      </s:Fault>
   </s:Body>
</s:Envelope>
于 2013-09-09T13:06:19.320 に答える
0

しばらく前に参加したこの長いスレッドを思い出しました: http ://social.msdn.microsoft.com/forums/en-US/biztalkr2adapters/thread/f69ec7af-a490-4229-81d4-3d1b41bf9c48/

それらはあなたを助けるかもしれないSDKサンプルを参照しますが、それはタイプされた(あなたが要求したようにタイプされていない)障害例外です。

于 2011-01-20T04:20:59.167 に答える