2016-01-18 3 views
9

asp.netでwep apiを作成しました。5.私はPost要求に対してファイル応答を返しています。ASP.netからファイルを返す方法5 web api

public HttpResponseMessage Post([FromBody]DocumentViewModel vm) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 

       var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name); 
       var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields); 
       var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content));     

       var result = new HttpResponseMessage(HttpStatusCode.OK) 
       { 
        Content = new ByteArrayContent(System.IO.File.ReadAllBytes(file)) 
       }; 
       result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") 
       { 
        FileName = "test.pdf" 
       }; 
       result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
       return result; 

      } 

     } 
     catch (Exception ex) 
     { 
      Response.StatusCode = (int)HttpStatusCode.BadRequest; 
      return null; 
     } 
     Response.StatusCode = (int)HttpStatusCode.BadRequest; 
     return null; 

    } 

は、どのように私の代わりにJSONの応答として、実際のファイルを返すことができ、私はテストクライアントとしてポストマンを使用しています:?しかし、その代わりに、ファイルの応答は、コード `

{ 
    "version": { 
    "major": 1, 
    "minor": 1, 
    "build": -1, 
    "revision": -1, 
    "majorRevision": -1, 
    "minorRevision": -1 
    }, 
    "content": { 
    "headers": [ 
     { 
     "key": "Content-Disposition", 
     "value": [ 
      "attachment; filename=test.pdf" 
     ] 
     }, 
     { 
     "key": "Content-Type", 
     "value": [ 
      "application/pdf" 
     ] 
     } 
    ] 
    }, 
    "statusCode": 200, 
    "reasonPhrase": "OK", 
    "headers": [], 
    "requestMessage": null, 
    "isSuccessStatusCode": true 
}` 

のように見えます。

+0

おそらくこれは助けることができる:http://stackoverflow.com/questions/9541351/returning-binary-file-from-controller-in-asp-net-web-api – jpgrassi

+0

NOP、それはまだのようにJSONを返します結果: –

答えて

5

はIActionResultを代わりに使用するHttpResponseMessage。 FileStreamResultが返され、動作しました。

新しい問題が発生しました。このファイルは、サーバーからのストリームで開くファイルではありません。しかし、そのために新たな疑問が生まれます。

継続:Return file from ASP.NET 5 Web API

おかげ

0

設定はHttpContext.Response.ContentType = "application/pdf"に一切役に立ちますか?

これはあなたのニーズに合わせなければならない:

public FileResult TestDownload() 
    { 
     HttpContext.Response.ContentType = "application/pdf"; 
     FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes("YOUR PATH TO PDF"), "application/pdf") 
     { 
      FileDownloadName = "test.pdf" 
     }; 

     return result;         
    } 
+0

いいえ、助けになりません。結果は変わりません。 –

+0

''ヘッダー ':[]、 'は何も埋め込まれていませんか?私はあなたの最初の投稿から空であることがわかります。どのようなasp.net 5のビルドを使用して、それは完全ですか.netまたはcoreclr? –

+0

いいえ、空のままです。 –

1

はこれを試してみてください!

[HttpGet] 
    public HttpResponseMessage Get() 
    { 
     var fs = new FileStream(myfileInfo.FullName, FileMode.Open, FileAccess.Read, 
           FileShare.Read, 32768, true); 
      var response = this.Request.CreateResponse(); 
      response.Content = new StreamContent(fs); 
      response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
      response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      response.Content.Headers.ContentLength = fs.Length; 
      fs.Dispose(); 
      return response; 
    } 
関連する問題