Mule出站http端点内容长度不匹配

时间:2013-04-18 17:25:48

标签: mule endpoint

我正在尝试从一个REST客户端到另一个REST客户端执行基本的GET / POST。我正在获取并正确映射数据,但它在POST http oubound端点期间超时。在使用Fiddler Web Debugger时,我发现问题在于Content-Length。我收到错误“Content-Length mismatch:RequestHeader指示403个字节,但客户端发送了61个字节。”

如果使用以下语法手动设置Content-Length,则它可以正常工作:

<message-properties-transformer scope="outbound>
    <add-message-property key="Content-Type" value="application/json"/>
    <add-message-property key="Content-Length" value="61"/>
</message-properties-transformer>

我不明白为什么Content-Length不正确。我无法将其硬编码为61,因为我正在传输的记录总是会有不同的长度。

非常感谢任何想法。

布雷特

注意:这是完整的流程:

<http:endpoint exchange-pattern="request-response" host="slcomax.ameipro.com" port="80" path="maxrest/rest/mbo/worktype/115?_lid=mxintadm&amp;_lpwd=mxintadm" method="GET" name="HTTP" doc:name="HTTP"/>
<data-mapper:config name="maxtondtypes" transformationGraphPath="maxtondtypes.grf" doc:name="maxtondtypes"/>
<flow name="ruby_rest_testerFlow1" doc:name="ruby_rest_testerFlow1">
    <quartz:inbound-endpoint jobName="getTypes" repeatInterval="600000" responseTimeout="10000" doc:name="Quartz">
        <quartz:endpoint-polling-job>
            <quartz:job-endpoint ref="HTTP"/>
        </quartz:endpoint-polling-job>
    </quartz:inbound-endpoint>
    <echo-component doc:name="Echo"/>
    <data-mapper:transform config-ref="maxtondtypes" doc:name="DataMapper"/>
    <echo-component doc:name="Echo"/>
    <http:outbound-endpoint exchange-pattern="request-response" host="ndeavor.ameipro.com" port="80" path="types" doc:name="HTTP" contentType="application/json">
        <message-properties-transformer scope="outbound"> 
            <add-message-property key="Content-Type" value="application/json"/>
            <!-- <add-message-property key="Content-Length" value="61"/> -->
        </message-properties-transformer> 
    </http:outbound-endpoint>
    <echo-component doc:name="Echo"/>
</flow>

1 个答案:

答案 0 :(得分:0)

问题是由于Quartz入站端点处理端点轮询的方式:它接受从端点交互接收的所有属性,并将它们放在出站范围内,这完全混淆了下游的内容。这是一个错误IMO:属性应该放在入站范围内。

对于记录,这是Quartz轮询器在出站范围中放置的内容:

Cache-Control=no-cache
Content-Language=en-US
Content-Length=360
Content-Type=application/json
Date=Thu, 18 Apr 2013 18:00:12 GMT
Expires=Thu, 01 Dec 1994 16:00:00 GMT
MULE_ENCODING=UTF-8
Server=IBM_HTTP_Server
Set-Cookie=JSESSIONID=0000TRNJZ71m3RLX-NDBwfC-quo:-1; Path=/

因为所有这些属性都在出站范围内,http:outbound-endpoint会选择它们并使用它们...因此错误的内容长度(更不用说它也无缘无故地发送的所有其他疯狂标题)

解决方案是使用HTTP轮询连接器而不是Quartz,如下所示:

<http:connector name="httpConnector" />
<http:polling-connector name="httpPollingConnector"
    pollingFrequency="600000" />

<http:endpoint name="worktypePoller" exchange-pattern="request-response"
    host="slcomax.ameipro.com" port="80"
    path="maxrest/rest/mbo/worktype/115?_lid=mxintadm&amp;_lpwd=mxintadm"
    method="GET" connector-ref="httpPollingConnector" />

<flow name="ruby_rest_testerFlow1">
    <http:inbound-endpoint ref="worktypePoller" />
    <data-mapper:transform config-ref="maxtondtypes" />
    <http:outbound-endpoint exchange-pattern="request-response"
        host="ndeavor.ameipro.com" port="80" path="types" connector-ref="httpConnector">
        <set-property propertyName="Content-Type" value="application/json" />
    </http:outbound-endpoint>
</flow>