【问题标题】:WCF disable chunked Transfer-EncodingWCF 禁用分块传输编码
【发布时间】:2013-11-08 11:34:40
【问题描述】:

我使用了一个安静的 WCF,我调用了一个具有流返回类型的方法,这是响应:

HTTP/1.1 200 OK
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: application/octet-stream
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Fri, 08 Nov 2013 11:25:29 GMT

6
1;1;

0

我想禁用

传输编码:分块

因为它写了一些我不需要的附加信息(正文中的 6 和 0)

我该怎么做?

【问题讨论】:

  • 我建议只编写客户端,以便正确处理 T-E: chunked。
  • 同意。根据RFC 7230,“收件人必须能够解析和解码分块传输编码。”修复客户端比让您的服务迎合损坏的实现更好,IMO。

标签: c# wcf http stream web-config


【解决方案1】:

当您创建 WCF 端点时,您需要指定您使用的传输模式 (TransferMode)。

  • 如果设置为StreamedResponseTransfer-Encoding: chunked 将自动添加到响应头中,Content-Length 将自动省略,您无能为力,即使您明确设置了Content-Length .它是 Content-Length 或 Transfer-Encoding,它们根据传输模式相互替换,请阅读this (the first paragraph)
  • 如果设置为Buffered,则不会自动添加Transfer-Encoding: chunked,如果您指定Content-Length,则允许包含它。

所以像这样创建你的端点:

WebHttpBinding wb = new WebHttpBinding(WebHttpSecurityMode.Transport);
wb.TransferMode = TransferMode.Buffered; // TransferMode.StreamedResponse;
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(myService.IBlah), blah, "");

我从 WCF WebGet 流式传输 MP3 音频时遇到了这个问题,但我看不到 Content-Length。一旦您的端点配置了Buffered 传输模式,您将开始看到Content-Length

对我来说,这只是成功的一半。为了在 Chrome 上正确播放 MP3,我还必须在响应标头中添加 Accept-Ranges: bytes,以便在 Chrome 上可以搜索音频。

【讨论】:

    猜你喜欢
    • 2014-07-01
    • 1970-01-01
    • 2023-03-16
    • 2018-07-12
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2012-11-02
    • 2013-02-13
    相关资源
    最近更新 更多