Retour PDF dans le Navigateur à l'aide de Asp.net de base
J'ai créé le Wep API ASP.Net de base de revenir les PDF. Voici mon code:
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;
}
Mais il ne renvoie que la réponse 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
}
Je fais quelque chose de mal ici?
Vous devez vous connecter pour publier un commentaire.
Comme expliqué dans ASP.NET Core HTTPRequestMessage retourne étrange message JSON, ASP.NET de Base ne prend pas en charge le retour d'un
HttpResponseMessage
(quel forfait avez-vous installer pour obtenir l'accès à ce type?).De ce fait, le processus est tout simplement l'écriture de toutes les propriétés publiques de la
HttpResponseMessage
à la sortie, comme il le ferait avec tout autre non pris en charge type de réponse.À l'appui des réponses personnalisées, vous devez retourner un
IActionResult
-type d'implémentation. Il y a beaucoup de ceux. Dans votre cas, j'aurais l'air dans leFileStreamResult
:Ou tout simplement utiliser un
PhysicalFileResult
, où le flux est géré pour vous:Bien sûr, tout cela peut être simplifiée en utilisant des méthodes d'assistance, tels que
Controller.File()
:Ce simplement résumés de la création d'un
FileContentResult
ouFileStreamResult
(pour cette surcharge, le dernier).Ou si vous êtes à la conversion des vieux MVC Web ou application de l'API et ne voulez pas convertir toutes vos code à la fois, ajouter une référence à WebApiCompatShim (NuGet) et enveloppez votre code actuel dans un
ResponseMessageResult
:Si vous ne souhaitez pas utiliser
return File(fileName, contentType, fileDownloadName)
, puis leFileStreamResult
ne prend pas en charge la définition de l'-tête content-disposition à partir du constructeur ou par le biais des propriétés.Dans ce cas, vous devrez ajouter que l'en-tête de réponse à la réponse vous-même avant de retourner le fichier résultat:
Microsoft.Net.Http.Headers.ContentDispositionHeaderValue
qui fait la même chose.Newtonsoft.Json.JsonSerializationException: Error getting value from 'ReadTimeout' on 'System.IO.FileStream'. ---> System.InvalidOperationException: Timeouts are supported for this stream.
MemoryStream
ne semble pas fonctionner.IActionResult
-la mise en œuvre de types comme recommandé. E. g. J'ai été en mesure d'utiliserFileContentResult
retour d'unbyte[]
sans un nom de fichier etContentResult
retour d'unstring
contenu avec le ContentType et StatusCode.Je ne pouvais pas commenter la réponse par CodeCaster depuis ma réputation n'est pas assez haut.
Lorsque vous essayez
nous avons obtenu un
Nous avons retiré l'aide de
Et que travaillé. C'est ASP.NET de Base 2.1 exécution dans IIS Express.
Je n'ai pas assez de réputation pour ce post un commentaire, afin de poster une réponse. Les 3 premières solutions de @CodeCaster et la solution de @BernhardMaertl sont corrects.
Cependant, pour quelqu'un qui ne peut pas travailler avec des fichiers souvent (comme moi), veuillez noter que si le processus de l'exécution de ce code (par exemple, l'API) seulement a les autorisations de lecture du fichier, vous devez spécifier que le troisième paramètre lors de la création de votre
FileStream
, sinon le comportement par défaut est d'ouvrir le fichier en lecture/écriture, et vous aurez une exception puisque vous n'avez pas les permissions d'écriture.La 3ème solution de @CodeCaster ressemblerait alors à ceci: