Вы должны посмотреть на веб-обработчики (.ashx). Они идеально подходят для того, чего вы пытаетесь достичь.
Например:
public class Download : IHttpHandler, IRequiresSessionState {
public void ProcessRequest(HttpContext context) {
var pdfBytes = /* load the file here */
context.Response.ContentType = @"Application/pdf";
context.Response.BinaryWrite(pdfBytes);
context.Response.End();
}
}
UPDATE:
Обработчик ashx на самом деле является заменой aspx. По сути, он не имеет пользовательского интерфейса, но все еще обрабатывает запросы на получение / публикацию, как это делает страница aspx. Суть в том, чтобы уменьшить накладные расходы, создаваемые обычной страницей aspx, когда все, что вам нужно сделать, это вернуть какой-то простой контент (например, файл ...) или выполнить быстрое действие.
Интерфейс IRequiresSessionState позволяет вам использовать объект SESSION, как любая другая страница вашего сайта. Если вам это не нужно, оставьте это.
На этом сайте есть интересный обзор того, как его создать. Игнорируйте Шаг 4, так как вам, вероятно, это безразлично.
Предполагая, что у вас есть обычная страница (aspx) со ссылкой на ваш документ: ссылка в файле aspx будет фактически указывать непосредственно на ваш обработчик ashx. например:
<a href="/document.ashx?id=blah">Click Here</a>
Тогда код в методе ProcessRequest обработчика ashx будет выполнять любые необходимые вызовы (например, разговор с вашей DLL), чтобы найти документ, а затем направить его обратно в браузер через вызов метода context.Response.BinaryWrite. *