ASP.NET Core を使用して PDF をブラウザーに返す 質問する

ASP.NET Core を使用して PDF をブラウザーに返す 質問する

PDF を返すために、ASP.Net コアで Wep API を作成しました。コードは次のとおりです。

public HttpResponseMessage Get(int id)
{
    var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK);           
    var stream = new System.IO.FileStream(@"C:\Users\shoba_eswar\Documents\REquest.pdf", System.IO.FileMode.Open);
    response.Content = new StreamContent(stream);
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
    response.Content.Headers.ContentDisposition.FileName = "NewTab";
    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf");
    return response;
}

ただし、JSON 応答のみが返されます。

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

   ],
   "requestMessage":null,
   "isSuccessStatusCode":true
}

ここで何か間違ったことをしているのでしょうか?

ベストアンサー1

で説明したようにASP.NET Core HTTPRequestMessage が奇妙な JSON メッセージを返すASP.NET Core はHttpResponseMessage(その型にアクセスするためにどのパッケージをインストールしましたか?) を返すことをサポートしていません。

このため、シリアライザーはHttpResponseMessage、他のサポートされていない応答タイプの場合と同様に、 のすべてのパブリック プロパティを出力に書き込むだけです。

カスタムレスポンスをサポートするには、IActionResult実装型を返す必要があります。たくさんありますあなたの場合は、FileStreamResult:

public IActionResult Get(int id)
{
    var stream = new FileStream(@"path\to\file", FileMode.Open);
    return new FileStreamResult(stream, "application/pdf");     
}

または、PhysicalFileResultストリームはここで処理されます:

public IActionResult Get(int id)
{
    return new PhysicalFileResult(@"path\to\file", "application/pdf");
}

もちろん、これらすべては次のようなヘルパー メソッドを使用して簡略化できますController.File()

public IActionResult Get(int id)
{
    var stream = new FileStream(@"path\to\file", FileMode.Open);
    return File(stream, "application/pdf", "FileDownloadName.ext");
}

FileContentResultこれは単に、またはFileStreamResult(このオーバーロードの場合は後者)の作成を抽象化します。

または、古いMVCまたはWeb APIアプリケーションを変換していて、すべてのコードを一度に変換したくない場合は、WebApiCompatShim (NuGet)現在のコードをResponseMessageResult:

public IActionResult Get(int id)
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);           
    var stream = ...
    response.Content...

    return new ResponseMessageResult(response);
}

を使用しない場合return File(fileName, contentType, fileDownloadName)、 はFileStreamResultコンストラクタまたはプロパティを通じて content-disposition ヘッダーの設定をサポートしません。

その場合、ファイルの結果を返す前に、その応答ヘッダーを自分で応答に追加する必要があります。

var contentDisposition = new ContentDispositionHeaderValue("attachment");
contentDisposition.SetHttpFileName("foo.txt");
Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();

おすすめ記事