私は、IBM HTTP Server (IHS) でホストされている Java Web サービス エンドポイントが Content-Length ヘッダーを必要とするという厳しい状況にありますが、HTTP/1.1 に準拠していると思われます。ヘッダーを送信すると、すべてが機能します。オフのままにしておくと、500 エラー応答が返され、POST エンティティ本体が空であることが通知されます (空ではないにもかかわらず)。
これらのサービス (サード パーティによって開発された) の WCF クライアントにかなりの時間を費やしましたが、要求に Content-Length ヘッダーを追加する良い方法が見つからないようです。このようなブログ投稿で説明されているように、IClientMessageInspector を使用して任意のヘッダー (つまり、X-Dan-Lynn-Header) を要求に追加できますが、WCF は Content-Length ヘッダーを無視するようです。
私のオプションは次のとおりです。
a) WCF に Content-Length ヘッダーを HTTP POST 要求に追加させる方法を理解するか、または、
b) Content-Length ヘッダーでリクエストを装飾する、非常に単純でありながら透過的な HTTP プロキシを見つけるか、または作成します。
ありがとう!
サンプル 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>