2016-11-08 20 views
6

का उपयोग कर ब्राउजर पर पीडीएफ लौटाएं मैंने पीडीएफ वापस करने के लिए एएसपी.Net कोर में वीपी एपीआई बनाया है। यहाँ मेरी कोड है:Asp.net कोर

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 
} 

मैंने कुछ गलत यहां क्या कर रहा हूं?

उत्तर

16

जैसा कि ASP.NET Core HTTPRequestMessage returns strange JSON message में बताया गया है, एएसपी.नेट कोर HttpResponseMessage लौटने का समर्थन नहीं करता है (उस प्रकार तक पहुंच प्राप्त करने के लिए आपने किस पैकेज को इंस्टॉल किया था?)।

इस वजह से, सीरिएलाइज़र आउटपुट में HttpResponseMessage के सभी सार्वजनिक गुणों को बस लिख रहा है, क्योंकि यह किसी भी अन्य असमर्थित प्रतिक्रिया प्रकार के साथ होगा।

कस्टम प्रतिक्रियाओं का समर्थन करने के लिए, आपको IActionResult-पूरक प्रकार वापस करना होगा। plenty of those है। आपके मामले में, मैं FileStreamResult पर गौर करेंगे:

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

या बस एक PhysicalFileResult, जहां धारा आप के लिए नियंत्रित किया जाता है का उपयोग करें:

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

इस सब के सहायक का उपयोग कर सरल किया जा सकता

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

यह केवल इस overlo के लिए (एक FileContentResult या FileStreamResult के निर्माण के सार: इस तरह के रूप Controller.File() तरीकों, विज्ञापन, उत्तरार्द्ध)।

या आप एक पुराने MVC या वेब एपीआई आवेदन परिवर्तित कर रहे हैं और अपने सभी कोड एक ही बार में, एक ResponseMessageResult में अपने वर्तमान कोड परिवर्तित WebApiCompatShim (NuGet) के लिए एक संदर्भ जोड़ने के लिए और रैप करने के लिए नहीं करना चाहते हैं:

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 कन्स्ट्रक्टर या गुणों के माध्यम से सामग्री-स्वभाव शीर्षलेख सेट करने का समर्थन नहीं करता है।

उस मामले में आप फ़ाइल परिणाम लौटने से पहले अपने आप को जवाबी कार्रवाई के लिए कि प्रतिक्रिया हेडर जोड़ना होगा:

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

इसका भी काम नहीं कर रहा। System.Net.Mime.ContentDisposition Asp.net कोर में समर्थित नहीं है। – Shoba

+0

जब मैं इस रिटर्न फ़ाइल का उपयोग करता हूं तो यह कार्य करता है (System.IO.File.OpenRead ("पूर्ण-फ़ाइल-पथ"), सामग्री टाइप: "एप्लिकेशन/पीडीएफ"); धन्यवाद कोडकास्टर .. – Shoba

+0

@Shoba System.Net.Mime को "समर्थित" होने की आवश्यकता नहीं है, क्योंकि यह सब सामग्री हेडर को स्ट्रिंग के रूप में सेट करने के लिए एक रैपर प्रदान करता है। आपको बस उचित संदर्भ जोड़ने की जरूरत है। लेकिन आप सही हैं, आपको उन संदर्भों की बिल्कुल आवश्यकता नहीं है, ['Microsoft.Net.Http.Headers.ContentDispositionHeaderValue'] भी है (https://docs.asp.net/projects/api/en/latest/ऑटोपाई/माइक्रोसॉफ्ट/नेट/एचटीपी/हेडर/कंटेंट डिस्पोजिशन हैडर वैल्यू /) जो वही करता है। – CodeCaster