我遇到了一个棘手的问题,我的Java Web服务端点托管在IBM HTTP服务器(IHS)上,虽然它应该符合HTTP/1.1标准,但需要Content-Length头。如果我发送这个头,一切都正常。如果我省略它,我会收到500错误响应,告诉我我的POST实体主体是空的(尽管不是空的)。
我们已经为这些服务投入了大量时间(由第三方开发),但我似乎找不到一种好的方法来追加Content-Length头到请求中。我能够使用IClientMessageInspector添加任意头部(例如X-Dan-Lynn-Header)到请求中,如这篇博客所述,但WCF似乎忽略Content-Length头。
我的选择是:
a) 弄清楚如何强制WCF将Content-Length头追加到HTTP POST请求中或,
b) 找到或编写一个极其简单透明的HTTP代理,用Content-Length头装饰请求。
谢谢!
示例:IClientMessageInspector.BeforeSendRequest
我们已经为这些服务投入了大量时间(由第三方开发),但我似乎找不到一种好的方法来追加Content-Length头到请求中。我能够使用IClientMessageInspector添加任意头部(例如X-Dan-Lynn-Header)到请求中,如这篇博客所述,但WCF似乎忽略Content-Length头。
我的选择是:
a) 弄清楚如何强制WCF将Content-Length头追加到HTTP POST请求中或,
b) 找到或编写一个极其简单透明的HTTP代理,用Content-Length头装饰请求。
谢谢!
示例:IClientMessageInspector.BeforeSendRequest
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
var buffer = request.CreateBufferedCopy(Int32.MaxValue);
var tempRequest = buffer.CreateMessage();
HttpRequestMessageProperty httpRequest = GetHttpRequestProp(tempRequest);
if (httpRequest != null)
{
if (string.IsNullOrEmpty(httpRequest.Headers[HttpRequestHeader.ContentLength]))
{
httpRequest.Headers.Add(HttpRequestHeader.ContentLength, GetMessageLength(buffer).ToString());
httpRequest.Headers.Add("X-Dan-Lynn-Header", "abcdefghijk");
}
}
request = tempRequest;
request.Properties[HttpRequestMessageProperty.Name] = httpRequest;
return null;
}
WCF生成的示例请求(以及前面的IClientMessageInspector):
POST /path/to/service HTTP/1.1
Content-Type: text/xml; charset=utf-8
X-Dan-Lynn-Header: abcdefghijk
SOAPAction: "http://tempuri.org/path/to/service/action"
Host: service.host.tld
Transfer-Encoding: chunked
Connection: Keep-Alive
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
.......body removed for clarity......
</s:Body>
</s:Envelope>