WCF-Content-Length-HTTP-header bei ausgehenden Nachricht
Ich bin in einer schwierigen situation, in der ein Java-web-service-Endpunkt-gehostet auf einem IBM HTTP Server (IHS) erfordert eine Content-Length-header, obwohl es angeblich konform zu HTTP/1.1. Wenn ich senden Sie die Kopfzeile, alles funktioniert. Wenn lasse ich es Weg, bekomme ich einen 500 Fehler Antwort, die mir mitteilte, dass mein BEITRAG im entity-body leer war (obwohl es nicht war).
Haben wir investiert erhebliche Zeit in unserem WCF-client für diese Dienste (entwickelt von einem Dritten), und ich kann nicht scheinen zu finden ein guter Weg, um fügen Sie eine Content-Length-header der Anfrage. Ich bin in der Lage, zum hinzufügen von beliebigem Header (also X-Dan-Lynn-Header), um die Anforderung mit einem IClientMessageInspector wie beschrieben in blog-posts wie diesem, aber WCF scheint zu ignorieren, die einen Content-Length-header.
Meine Optionen sind:
a) herausfinden, wie die Kraft WCF zum Anhängen einer Content-Length-header der HTTP-POST-request oder,
b) oder schreiben Sie eine äußerst einfache, aber transparente HTTP-proxy, schmückt die Anfrage mit einer Content-Length-header.
Dank!
Probe 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;
}
Beispiel-Anfrage generiert, die von der WCF (und die vorhergehenden 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>
- Ist es mit einen anderen header wie "Transfer-Encoding: chunked" oder sowas in der Art? Das fehlen einer Content-Length-header könnte darauf hinweisen, dass Sie das streaming des requests, etc.
- Vielleicht ist der chunked header verursacht das problem. Ich werde forschen und berichten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Herausgefunden. Einstellung der Bindung zu verwenden transferMode="Gestreamt" wurde verursacht eine Transfer-Encoding: chunked. Wir brauchten gestreamt transfers aufgrund von sehr großen Antworten vom web-service, so dass ich in der Lage war zu gehen mit:
Schlecht:
Gut:
Ändern der Bindung an das das problem gelöst:
Ich bin momentan nicht in der Lage, tatsächlich versuchen, führen Sie den code, um zu sehen, was passiert, aber so etwas wie
sehen http://msdn.microsoft.com/en-us/library/aa395196.aspx für weitere Informationen, wie Sie verwenden können, die OperationContextScope-Objekt, um zusätzliche Header.
update:
Ich muss sagen, ich finde das eine seltsame Frage. Ich Frage mich, warum die content-length nicht gesetzt. Ich wäre nicht surprissed, wenn Sie Ihre eigentliche problem ist irgendwo anders.
transferMode=StreamedResponse in der app.config bei mir auch geholfen bei einem Problem ähnlich wie bei Ihnen.
Ich hatte einen WCF-Architektur für die Sync Framework und der Squid-proxy-3.1.20 wusste nicht, wie das Gestreamte transferMode
Vielen Dank !