コンテンツがPDFファイルに設定されているHttpResponseMessageを返すWebAPIを作成しました。 Web Apiを直接呼び出すと、うまく機能し、PDFがブラウザーに表示されます。
response.Content = new StreamContent(new FileStream(pdfLocation, FileMode.Open, FileAccess.Read));
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
response.Headers.ConnectionClose = true;
return response;
Web Apiに接続し、Pdfファイルを要求してから、上記と同じ方法でユーザーにレンダリングしたいMVCクライアントがあります。
残念ながら、問題がどこにあるのかわかりませんが、content-typeを設定したとしても:
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
Web APIを呼び出すリンクをクリックすると、HttpResponseMessageのテキストレンダリングが表示されます。
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Connection: close Content-Disposition: attachment Content-Type: application/pdf }
クライアントアプリケーションには、WebApiのようにPDFをレンダリングできる設定が不足していると思います...
どんな助けでもいただければ幸いです。ありがとう
何時間ものGoogle検索と試行錯誤の末、私はここで問題を解決しました。
streamContentへの応答のコンテンツを設定する代わりに、WebApi側でByteArrayContentに変更しました。
byte[] fileBytes = System.IO.File.ReadAllBytes(pdfLocation);
response.Content = new ByteArrayContent(fileBytes);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
このようにすることで、MVC4アプリケーションはWebClientとDownloadDataメソッドを使用してPDF)をダウンロードできます。
internal byte[] DownloadFile(string requestUrl)
{
string serverUrl = _baseAddress + requestUrl;
var client = new System.Net.WebClient();
client.Headers.Add("Content-Type", "application/pdf");
return client.DownloadData(serverUrl);
}
返されるByte []配列は、出力用にファイルを返す前に、MemoryStreamに簡単に変換できます。
Response.AddHeader("Content-Disposition", "inline; filename="+fileName);
MemoryStream outputStream = new MemoryStream();
outputStream.Write(file, 0, file.Length);
outputStream.Position = 0;
return File(outputStream, "application/pdf");
私はそれを機能させるために多くの時間を無駄にしてきたので、これが他の人に役立つことを願っています。
PhysicalFileResultを返し、HttpGetメソッドを使用するだけで、urlはpdfファイルを開きます
public ActionResult GetPublicLink()
{
path = @"D:\Read\x.pdf";
return new PhysicalFileResult(path, "application/pdf");
}