gpt4 book ai didi

出站消息上的 WCF Content-Length HTTP header

转载 作者:行者123 更新时间:2023-12-03 04:15:38 27 4
gpt4 key购买 nike

我遇到了一个棘手的情况,IBM HTTP Server (IHS) 上托管的 Java Web 服务端点需要 Content-Length header ,尽管它应该符合 HTTP/1.1。如果我发送 header ,一切正常。如果我保留它,我会收到 500 错误响应,通知我我的 POST 实体主体为空(即使它不是)。

我们在 WCF 客户端上投入了大量时间来提供这些服务(由第三方开发),但我似乎找不到向请求附加 Content-Length header 的好方法。我可以使用 IClientMessageInspector 将任意 header (即 X-Dan-Lynn-Header)添加到请求中,如 blog posts like this 中所述。 ,但 WCF 似乎忽略了 Content-Length header 。

我的选择是:

a) 弄清楚如何强制 WCF 将 Content-Length header 附加到 HTTP POST 请求,或者,

b) 找到或编写一个极其简单但透明的 HTTP 代理,用 Content-Length header 装饰请求。

谢谢!

示例 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>

最佳答案

想通了。将绑定(bind)设置为使用transferMode =“Streamed”会导致Transfer-Encoding:分块。由于网络服务的响应非常大,我们需要流式传输,因此我可以选择:

不好:

transferMode="Streamed"

好:

transferMode="StreamedResponse"

更改对此的绑定(bind)解决了问题:

<basicHttpBinding>
<binding name="MyBinding" closeTimeout="00:30:00" openTimeout="00:30:00"
receiveTimeout="00:30:00" sendTimeout="00:30:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="16777216"
messageEncoding="Text" textEncoding="utf-8" transferMode="StreamedResponse"
useDefaultWebProxy="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="65536"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None" />
</binding>
</basicHttpBinding>

关于出站消息上的 WCF Content-Length HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1365295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com