3 Stimmen

WCF Content-Length HTTP-Header bei ausgehender Nachricht

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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X