'Web API and report viewer
I have a requirement to produce within a Web API a service that will return a pdf of a local report viewer file.
In MVC you can do something like this using FileResult but i'm struggling to replicate this as a HttpResponseMessage. Has anybody ever tried or had success in trying to do anything similar? All my attempts in trying toconvert the byte[] to a stream and then output as an HttpResponse have ended up with empty files.
public FileResult File() {
// Create a new dataset
StudentDataSet ds = new StudentDataSet();
// Create and fill the Student data table
// using the Student table adapter
StudentDataSetTableAdapters.StudentTableAdapter dta =
new StudentDataSetTableAdapters.StudentTableAdapter();
dta.Fill(ds.Student);
// Create a new report datasource with
// Name = the dataset name in the report,
// Value = the populated data table.
ReportDataSource rds = new ReportDataSource();
rds.Name = "DataSet1";
rds.Value = ds.Student;
ReportViewer rv = new Microsoft.Reporting.WebForms.ReportViewer();
rv.ProcessingMode = ProcessingMode.Local;
rv.LocalReport.ReportPath = Server.MapPath("~/Reports/StudentReport.rdlc");
// Add the new report datasource to the report.
rv.LocalReport.DataSources.Add(rds);
rv.LocalReport.Refresh();
byte[] streamBytes = null;
string mimeType = "";
string encoding = "";
string filenameExtension = "";
string[] streamids = null;
Warning[] warnings = null;
streamBytes = rv.LocalReport.Render("PDF", null, out mimeType, out encoding, out filenameExtension, out streamids, out warnings);
return File(streamBytes, mimeType, "StudentReport.pdf");
}
Solution 1:[1]
Please check this out : How to return PDF to browser in MVC?
I dont see anywhere that you are flushing the stream and setting the position to 0. If your PDF file is empty, then you need to set the position to 0 in order the data to have a start position for the byte stream.
Solution 2:[2]
You can try this..
byte[] ResponseStream = objConnection.GetStream(letterNumber, paperType);
HttpResponseMessage apiResponse;
apiResponse = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(ResponseStream)
};
apiResponse.Content.Headers.ContentLength = ResponseStream.Length;
apiResponse.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
apiResponse.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = String.Format("Letter_" + letterNumber + ".pdf")
};
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Community |
| Solution 2 | coder100 |
