2016-11-08 28 views
6
kullanarak tarayıcıya döndürün

PDF dosyasını döndürmek için ASP.Net çekirdeğindeki Wep API'sini oluşturdum. İşte benim kodudur:PDF'yi Asp.net core

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; 
} 

Ama sadece JSON yanıtı verir:

{ 
    "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 
} 

Burada yanlış bir şey yapıyorum?

cevap

16

ASP.NET Core HTTPRequestMessage returns strange JSON message'da açıklandığı gibi, ASP.NET Çekirdeği bir HttpResponseMessage döndürmeyi desteklemez (bu tür erişim için hangi paketi yüklediniz?).

Bu nedenle, seri hale getirici, HttpResponseMessage ürününün tüm genel özelliklerini, desteklenmeyen diğer yanıt türlerinde olduğu gibi, çıktıya yazmaktadır.

Özel yanıtları desteklemek için, bir IActionResult - yeniden yükleme türü döndürmeniz gerekir. plenty of those var.

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

Veya sadece akışı sizin için işlenir bir PhysicalFileResult kullanın: sizin durumda, FileStreamResult içine bakmak istiyorum

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

tüm bu yardımcı kullanarak basitleştirilmiş edilebilir yöntemler, örneğin Controller.File() olarak:

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

Bu sadece bu overlo (a FileContentResult veya FileStreamResult oluşturulmasını özetler reklam, ikincisi).

Yoksa eski bir MVC veya Web API başvurusunu dönüştürme konum ve bir ResponseMessageResult içerisinde geçerli kod, bir kerede kodunuzu dönüştürmek WebApiCompatShim (NuGet) bir başvuru eklemek ve sarmak için istemiyorsanız:

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

    return new ResponseMessageResult(response); 
} 

return File(fileName, contentType, fileDownloadName) kullanmak istemiyorsanız, FileStreamResult, içerik düzenleme üstbilgisini yapıcıdan veya özelliklerden ayarlamayı desteklemez. Bu durumda

dosya sonucunu dönmeden önce yanıt kendinizi bu yanıt üstbilgisi eklemek gerekir:

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

Onun da çalışmıyor. System.net.Mime.ContentDisposition Asp.net Core'da desteklenmiyor. – Shoba

+0

Bu Dönüşü Kullanırken Çalışıyor Dosya (System.IO.File.OpenRead ("tam dosya yolu"), contentType: "application/pdf"); Teşekkür ederim CodeCaster .. – Shoba

+0

@Shoba System.Net.Mime, içerik başlıklarını dizge olarak ayarlamak için bir sarmalayıcı sağladığından, "desteklenen" olması gerekmez. Sadece uygun referansları eklemeniz gerekiyor. Ama haklısınız, bu referanslara hiç ihtiyacınız yok, ayrıca ['Microsoft.Net.Http.Headers.ContentDispositionHeaderValue'] (https://docs.asp.net/projects/api/en/latest/autoapi/Microsoft/Net/Http/Başlıkları/ContentDispositionHeaderValue /) aynı şeyi yapar. – CodeCaster

İlgili konular