2017-12-05 11 views
2

アクセス時に特定のヘッダー(Content-Disposition)を取得できませんAngularサービスを介して。 CORSが有効になり、Angular HTTPClientがすべてのヘッダーを取得するように設定されます。クロスオリジンhttp.get要求のASP.NET Web API 2応答から特定の応答ヘッダー(Content-Dispositionなど)を取得

Startup.cs

public void Configuration(IAppBuilder app) 
     { 

      HttpConfiguration config = new HttpConfiguration(); 
      WebApiConfig.Register(config); 
      ConfigureOAuth(app, config); 
      app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 
      app.UseWebApi(config); 
} 

fileController.cs

[Route("file/{idFile}")] 
     public HttpResponseMessage GetFile(string idFile) 
     { 
      string file; 
      byte[] file; 

      document = fileService.GetFile(idDFile, out fileName); 

      var result = new HttpResponseMessage(HttpStatusCode.OK) 
      { 
       Content = new ByteArrayContent(file) 
      }; 
      result.Content.Headers.ContentDisposition = 
       new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
       { 
        FileName = nomeFile 
       }; 
      result.Content.Headers.ContentType = 
       new MediaTypeHeaderValue("application/octet-stream"); 

      return result; 
     } 

fileService.ts

getFile(fileId: number): Observable<Response> { 
     const url = `${urlBackEnd}/file/${fileId}`; 
     return this.http.get(url, { observe: 'response', responseType: 'blob' }) 
      .map(res => {; 
      console.log(res.headers.keys()); // There's no CONTENT-DISPOSITION 
      saveAs(<Blob>res.body); 
      return res.body; 
      }) 
      .catch(e => this.handleErrors(e)); 
} 

ここでヘッダーにconsole.logです:

[ 
    "content-type", 
    "cache-control" 
] 

は、私が何をしないのですが?私はちょうどContent-Dispositionヘッダーを取得したいです。あなたのfileController.csファイルで

+0

送信元からの要求を送信するサーバーには、Content-Dispositionをその値に持つレスポンスにna Access-Control-Expose-Headersヘッダーが含まれている必要があります。回答を見るhttps://stackoverflow.com/questions/39020385/fetch-api-not-returning-the-location-header/39021128#39021128 – sideshowbarker

+0

ありがとう@sideshowbarker、私はそれをやってみたが、まだ、私はそのヘッダーを取得することはできません。 https://i.imgur.com/NemwLRb.png 'result.Content.Headers.Add(" Access-Control-Expose-Headers "、" * ");' – Dyd666

+1

私はまだブラウザが ' 'Access-Control-Expose-Headersのワイルドカード値。代わりに、値にContent-Dispositionを明示的にリストしてください。 – sideshowbarker

答えて

3

は、ContentTypeContentDispositionレスポンスヘッダを設定するとともに、あなたはAccess-Control-Expose-Headersを設定する必要があります。

result.Content.Headers.Add("Access-Control-Expose-Headers", "ContentDisposition"); 

the relevant part of the Fetch specことがAccess-Control-Expose-Headersはその値として「*」ワイルドカードを持ってすることはできません。 ;代わりに、ブラウザがフロントエンドJavaScriptコードに公開するすべてのレスポンスヘッダー名を明示的に指定する必要があります(ただし、Cache-ControlContent-LanguageContent-TypeExpiresLast-Modified、およびPragmaは常に公開されます)。 6個以外の応答ヘッダー、およびAccess-Control-Expose-Headersヘッダーの値に明示的に記載した応答ヘッダーの場合、ブラウザーはフロントエンドコードのアクセスをブロックします。

関連する問題