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();