web-dev-qa-db-ja.com

HttpResponseMessageコンテンツは表示されませんPDF

コンテンツが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をレンダリングできる設定が不足していると思います...

どんな助けでもいただければ幸いです。ありがとう

12
user2163049

何時間もの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");

私はそれを機能させるために多くの時間を無駄にしてきたので、これが他の人に役立つことを願っています。

22
user2163049

PhysicalFileResultを返し、HttpGetメソッドを使用するだけで、urlはpdfファイルを開きます

public ActionResult GetPublicLink()



{
            path = @"D:\Read\x.pdf";
            return new PhysicalFileResult(path, "application/pdf");
}
0
Divya