2010-10-14 57 views
2

我有一个BizTalk 2009业务流程,其中包含作为WCF基本HTTP Web服务发布的请求 - 响应端口类型。端口有一个操作,并且该操作具有适当模式的请求和响应消息。在此端口上收到请求后,有几种情况应将错误消息返回给客户端而不是标准响应消息。我很难将正确的错误信息返回给客户端。我希望能够设置SOAP故障消息的faultcodefaultstring元素。以下是我尝试过的:BizTalk业务流程:使用非类型化SOAP错误进行响应

添加类型为字符串的故障消息: 我试图向操作添加带有消息类型字符串的故障消息。在编排中,我构造了一个字符串消息并将其作为响应发送。以后被输送回客户机故障看起来像:

<?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 类型的故障信息我想如果我构建了Fault元并送我也许能说服的BizTalk返回沿着我所期待什么线路故障消息。因此,我添加了一条类型为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

没有什么是简单的BizTalk :) – Nix 2010-10-14 20:00:12

+0

@Nix:同意!我没有说它*很简单,只是它*应该*而已。 – 2010-10-14 20:10:00

回答

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> 
+0

虽然我不再能够测试这种方法,但根据您的结果,这看起来应该是正确的答案。谢谢! – 2013-09-09 13:21:10

0

提醒这个长螺纹我参加了前阵子的: http://social.msdn.microsoft.com/forums/en-US/biztalkr2adapters/thread/f69ec7af-a490-4229-81d4-3d1b41bf9c48/

他们指的是SDK样本,可以帮助你,但它是一个类型化(不取消类型为您请求)故障异常。

+0

不幸的是,我从来没有能够弄清楚如何应对一个无类型的错误,我相当确信这在BizTalk 2009中是不可能的。我最终返回了序列化的字符串,并要求客户端反序列化消息。 – 2011-11-17 01:05:27

相关问题