У меня нет ответа на ваш вопрос. Включение полного сообщения об исключении было бы полезно. У меня недостаточно информации, чтобы помочь вам, но я бы хотел убедиться, что reportBase.Report.Document не равен NULL.
Однако я хочу прокомментировать ваш код в целом. Действие вашего контроллера не соответствует соглашениям ASP.NET MVC. Он не должен писать прямо в поток ответа. Во-первых, это сложно для модульного тестирования. Во-вторых, это приводит к взрыву ответственности за ваше действие (оно уже примерно в 4 раза больше, чем я предпочитаю, чтобы мои самые крупные контроллеры были). Response.End сокращает действие, а return view () ничего не делает. Я бы сделал что-то вроде:
var exportType = Request.Form["exportType"];
switch (exportType)
{
case "RTF":
return new RtfExportResult(reportBase.Report.Document);
case "TIFF":
return new TiffExportResult(reportBase.Report.Document);
case "XLS":
return new XlsExportResult(reportBase.Report.Document);
}
return View("Error"); // unsupported export type
Тогда ваш XlsExportResult будет выглядеть так:
public class XlsExportResult : ActionResult
{
private readonly Document document;
public XlsExportResult(Document document)
{
this.document= document;
}
public override void ExecuteResult(ControllerContext context)
{
var response = context.HttpContext.Response;
response.ContentType = "application/octet-stream";
response.AddHeader("Content-Disposition", "attachment;filename=report.xls");
var xlsExport = new XlsExport();
xlsExport.Export(this.document, response.OutputStream);
}
}
Затем вы могли бы написать тесты, чтобы упростить выполнение только части XlsExport. (Я также нашел бы способ скрыть XlsExport за интерфейсом.) С некоторой креативностью (добавив дополнительные свойства для таких вещей, как имя файла и т. Д.) Вы сможете повторно использовать * Result классы в вашем проекте.