2016-12-30 10 views
0

Я использую Spring Cloud и Zuul proxy в качестве шлюза для моего сервиса RESTful, предоставляемого микросервисом. Когда я выполняю запрос непосредственно к экземпляру микросервиса, все заголовки предоставляются, как я ожидал. Однако, когда тот же запрос проксируется Zuul, заголовок «Content-length» удаляется. Я сделал несколько исследований об этом, и я увидел, что Zuul добавляет заголовок «Transfer-Encoding» как «chunked», и в этом случае заголовок Content-length опущен (Content-Length is being stripped, Spring Cloud Netflix: Whats happening in ZuulConfiguration with the ZuulServlet?).Spring Boot + Zuul: как получить заголовок «Content-length» из файлового потока, предоставляемого службами RESTful?

Однако мне действительно нужно получить «Content-length», предоставляемый моей службой RESTful. Этот запрос также должен быть проксирован Zuul (у меня много экземпляров микросервиса, поэтому я бы не обращался к ним напрямую).

Вот метод в моем microservice:

@RequestMapping(value = "/jobresult/{id}", method = RequestMethod.GET) 
@Timed 
public ResponseEntity<InputStreamResource> downloadJobResult(@PathVariable Long id) { 
    Job job = jobService.findOne(id); 
    File file = new File(job.getTargetFile()); 
    try { 
     return ResponseEntity.ok().contentLength(file.length()).contentType(MediaType.APPLICATION_OCTET_STREAM).body(new InputStreamResource(new FileInputStream(file))); 
    } catch (FileNotFoundException e) { 
     log.error(e.getMessage(), e); 
    } 
} 

Например, запрос/API/jobresult/1 обеспечивает заголовок "Content-Length" правильно, но запрос/услуг/API/jobresult/1 (направлено Zuul) не отображает этот заголовок, а также модифицирует «Transfer-Encoding» для «chunked».

ответ

1

Отказоустойчивый фильтр Zuul от Spring Cloud Netflix вызывает проблему.

Решение

Добавить application.properties файл в вашем SRC/основные/ресурсов, если вы не имеете его и добавьте следующую строку:

zuul.set-content-length=true 
0

К сожалению, я не смог найти ответ на эту проблему. Чтобы все это работало, я написал альтернативный заголовок «X-Content-Length», содержащий размер файла.

Таким образом, Zuul не удаляет заголовок, и я могу прочитать его на стороне клиента. Поскольку у меня есть контроль над обоими, это не проблема. Но в других случаях клиенты должны знать о таком заголовке.