class ReportFetcher
{
public enum ReportFileFormat
{ PDF }
/// <summary>
/// Makes a call to a a SSRS server to load and render a report in a certain file format
/// </summary>
/// <param name="pathToReport">Path to the report on the server (including name)</param>
/// <param name="execParams">Execution parameters</param>
/// <param name="fileFormat">Rendering file format</param>
/// <returns></returns>
public byte[] ToFile(string pathToReport, List<ParameterValue> execParams, string format = "PDF")
{
ExecutionInfo execInfo;
var trusteduserHeader = new TrustedUserHeader();
var execHeader = new ExecutionHeader();
ServerInfoHeader serviceInfo;
var client = new ReportExecutionServiceSoapClient();
if (client.ClientCredentials == null)
{
throw new NullReferenceException("Client Credentials are null");
}
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
client.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
// Load the report
client.LoadReport(trusteduserHeader, pathToReport, null, out serviceInfo, out execInfo);
execHeader.ExecutionID = execInfo.ExecutionID;
client.SetExecutionParameters(execHeader, trusteduserHeader, execParams.ToArray(), "en-us", out execInfo);
// Render the report
string extension;
string encoding;
string mimeType;
string[] streamIds;
var warnings = new Warning[1];
warnings[0] = new Warning();
Byte[] result;
client.Render(execHeader, trusteduserHeader, format, null, out result, out extension, out mimeType, out encoding, out warnings, out streamIds);
ConnectionHelper.SafelyCloseConnection(client);
return result;
}
}
If you want to save the returned byte array to a file, it's easily done like this:
using (var stream = File.OpenWrite("myReport.pdf"))
{
stream.Write(result, 0, result.Length);
}