2016-12-30 5 views
0

マイクロサービスが提供するRESTfulサービスへのゲートウェイとしてSpring CloudとZuulプロキシを使用しています。私がマイクロサービスのインスタンスに直接リクエストを実行すると、すべてのヘッダーが私が期待どおりに提供されます。しかし、同じリクエストがZuulによってプロキシされると、ヘッダ "Content-length"は削除されます。私はそれについていくつかの調査を行いました。Zuulはヘッダー "Transfer-Encoding"を "チャンク"として追加し、この場合Content-lengthヘッダーは省略されています(Content-Length is being strippedSpring Cloud Netflix: Whats happening in ZuulConfiguration with the ZuulServlet?)。Spring Boot + Zuul:RESTfulサービスが提供するファイルストリームから「Content-length」ヘッダーを取得する方法は?

しかし、私は本当に私のRESTfulサービスによって提供される "Content-length"を取得する必要があります。このリクエストは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

Spring Cloud NetflixコードのZuulに対する応答フィルタが原因です。

zuul.set-content-length=true 
:あなたはそれを持って、次の行を追加しない場合

ソリューション

はあなたのsrc /メイン/リソースにapplication.propertiesファイルを追加します。

0

残念ながら、私はこの問題の答えを見つけることができませんでした。これらのことを機能させるために、ファイルサイズを含む別のヘッダ "X-Content-Length"を書きました。

このように、Zuulはヘッダーを消去せず、クライアント側で読むことができます。私は両方のコントロールがあるので、問題ではありません。しかし、他のケースでは、顧客はそのようなヘッダーを知っている必要があります。

関連する問題