BizTalk Server 2016 WCF-WebHttp适配器遇400状态码无法接收响应体
BizTalk Server 2016 WCF-WebHttp适配器处理REST API 400响应问题解决
问题场景
使用动态请求-响应发送端口搭配WCF-WebHttp适配器对接REST API时,API返回200状态码时流程正常,但返回400(Bad Request)状态码时,适配器直接抛出异常,无法获取API返回的JSON响应体,接收管道也不会执行。从生成的NACK消息中可以看到,API的JSON响应体已经包含在ErrorDescription字段中,但无法通过正常流程获取。
NACK示例:
<SOAP:Body> <SOAP:Fault> <faultcode>Microsoft BizTalk Server Negative Acknowledgment </faultcode> <faultstring>An error occurred while processing the message, refer to the details section for more information </faultstring> <faultactor>https://xxxxx/external/bill</faultactor> <detail> <ns0:NACK Type="NACK" xmlns:ns0="http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd"> <NAckID>{D7694C87-CEA3-4C1B-BA18-3ECC2B12857A}</NAckID> <ErrorCode>0xc0c0167a</ErrorCode> <ErrorCategory>0</ErrorCategory> <ErrorDescription> System.Net.WebException: The remote server returned an unexpected response: (400) BadRequest. {"responseCode":"POST-2013","responseDesc":"Bu işlemi yapmaya yetkili değildir.", "errorDetails":"Credential cannot use related institutionId"} </ErrorDescription> </ns0:NACK> </detail> </SOAP:Fault> </SOAP:Body> </SOAP:Envelope>
解决方案
方法1:配置适配器将400状态码视为成功
WCF-WebHttp适配器默认仅将2xx系列状态码视为成功响应,非2xx状态码会触发异常并生成NACK。可通过修改适配器行为配置,让400状态码被识别为成功响应,从而将响应体传递给接收管道:
- 打开BizTalk管理控制台,找到目标发送端口(或动态端口的配置模板)。
- 在WCF-WebHttp适配器配置的Behavior标签页,点击Add选择
webHttp行为,再点击Configure。 - 将
FaultExceptionEnabled设置为False,该选项控制是否将非2xx状态码转换为FaultException。 - 若需要更精细的状态码控制,添加
HttpStatusCodeMapper行为扩展,配置将400状态码映射为Success。
方法2:自定义管道组件提取NACK中的响应体
若无法修改适配器配置,可开发自定义接收管道组件,从NACK消息中提取JSON响应体:
- 创建BizTalk管道组件项目,实现
IComponent接口。 - 在
Execute方法中,判断输入消息是否为NACK(消息类型匹配http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd#NACK)。 - 读取
ErrorDescription字段内容,提取其中的JSON部分(即WebException信息之后的JSON字符串)。 - 将提取出的JSON作为新消息内容,设置对应业务消息类型后传递给后续管道。
方法3:WCF自定义行为扩展捕获错误响应
编写WCF自定义行为,捕获WebException并提取响应体,包装为正常消息返回给BizTalk:
- 创建WCF行为扩展类,实现
IEndpointBehavior接口。 - 在
ApplyClientBehavior方法中添加自定义ClientMessageInspector。 - 在
ClientMessageInspector的AfterReceiveReply方法中,检查响应状态码,若为400则读取响应流中的JSON内容,作为正常回复返回。 - 将该行为扩展注册到BizTalk的WCF配置中,然后在发送端口的行为配置里添加此行为。
注意事项
- 方法1是最直接的解决方案,但需确认API返回的400响应确实包含业务所需的错误信息,而非无效请求类的错误。
- 方法2适配无法修改适配器配置的场景,但需要额外开发管道组件。
- 方法3灵活性最高,可处理多种错误状态码,但需要具备WCF开发经验。
内容的提问来源于stack exchange,提问作者ecalis
相关产品推荐
相关产品推荐

