Когда вы создаете конечную точку WCF, вам нужно указать, какой режим передачи() вы используете.
- Если он установлен в
StreamedResponse
, Transfer-Encoding: chunked
будут автоматически добавлены в заголовки ответа, Content-Length
будет автоматически опускается, и нет ничего, что вы можете сделать о том, что, даже если вы установите Content-Length
явно. Это длина содержимого или передача-кодирование, они заменяют друг друга в зависимости от режима передачи, читайте 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, "");
У меня была эта проблема, когда я был потокового MP3-аудио с WCF WebGet, и я не мог видеть, Content-Length. Как только ваша конечная точка настроена с режимом передачи Buffered
, вы начнете видеть Content-Length
.
Для меня это была только половина битвы. Чтобы правильно воспроизводить MP3 в Chrome, мне пришлось добавить Accept-Ranges: bytes
в заголовки ответов, чтобы аудио можно было искать в Chrome.
Я бы рекомендовал просто написать клиенту, чтобы он правильно обрабатывал T-E: chunked. –
Согласовано. Per [RFC 7230] (http://tools.ietf.org/html/rfc7230#section-4.1): «Получатель ДОЛЖЕН иметь возможность анализировать и декодировать кодированное кодирование передачи». Лучше исправить клиента, чем заставить сервис обслуживать неисправные реализации, IMO. – cHao