2

我有一个带有请求-响应端口类型的 BizTalk 2009 编排,该端口类型发布为 WCF Basic-HTTP Web 服务。该端口有一个操作,并且该操作具有具有适当模式的请求和响应消息。在此端口上收到请求后,在少数情况下应该向客户端返回故障消息而不是标准响应消息。我很难将正确的故障消息返回给客户端。我希望能够同时设置 SOAP 错误消息的faultcodefaultstring元素。这是我尝试过的:

添加字符串类型的故障消息:我尝试将消息类型为字符串的故障消息添加到操作中。在编排中,我构造了一个字符串消息并将其作为响应发送。交付回客户端的故障如下所示:

<?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/#Fault 我认为我可能能够说服 BizTalk 返回错误消息,如果我构造Fault元素并发送它,我会期望它返回。所以我添加了一个类型为 的错误消息http://schemas.xmlsoap.org/soap/envelope/#Fault,构建了适当的消息并将其作为响应发送。结果与上面相同,除了不是字符串,该faultstring元素包含一个CDATA部分,其中包含我在其中构建的整个 xml 消息。

所以我现在被困住了;我觉得这应该是 BizTalk 中的一项简单任务。MSDN 上的文档How to Throw Fault Exceptions from Orchestrations Published as WCF Services没有告诉您“如何”抛出错误异常,除了它们可以抛出并且您需要includeExceptionDetailInFaults在配置中进行设置(我已经完毕)。

有人对如何在 BizTalk 2009 中实现这一点有任何建议吗?

4

2 回答 2

2

我通过添加自定义 WCF IDispatchMessageInspector 解决了这个确切的问题,我从序列化消息中读取原因文本,然后使用反序列化的原因文本返回新的 System.ServiceModel.FaultException 消息。

在 BizTalk 业务流程中,我使用 System.String 作为 PortType 错误消息类型。

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 回答