Ich befinde mich in einer schwierigen Situation, in der ein Java-Webdienst-Endpunkt, der auf einem IBM HTTP-Server (IHS) gehostet wird, einen Content-Length-Header benötigt, obwohl er angeblich HTTP/1.1 entspricht. Wenn ich den Header sende, funktioniert alles. Wenn ich ihn weglasse, erhalte ich eine 500-Fehler-Antwort, die mich darüber informiert, dass mein POST-Entity-Body leer war (obwohl er es nicht war).
Wir haben viel Zeit in unseren WCF-Client für diese Dienste investiert (der von einem Drittanbieter entwickelt wurde), und ich scheine keine gute Möglichkeit zu finden, einen Content-Length-Header an die Anforderung anzuhängen. Ich bin in der Lage, beliebige Header (z. B. X-Dan-Lynn-Header) an die Anforderung mit einem IClientMessageInspector hinzuzufügen, wie beschrieben in Blogbeiträge wie dieser aber WCF scheint einen Content-Length-Header zu ignorieren.
Meine Optionen sind:
a) herauszufinden, wie man WCF zwingen kann, einen Content-Length-Header an die HTTP-POST-Anfrage anzuhängen oder,
b) einen extrem einfachen und dennoch transparenten HTTP-Proxy finden oder schreiben, der die Anfrage mit einem Content-Length-Header versieht.
Gracias.
Beispiel 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;
}
Von WCF (und dem vorangehenden IClientMessageInspector) erzeugte Beispielanforderung:
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>