Загрузка страницы aspx

#asp.net #vb.net #download

#asp.net #vb.net #Скачать

Вопрос:

В моем веб-приложении у меня есть страница aspx, которая содержит HTML-таблицу и несколько строк текста. Мне нужно, чтобы пользователи могли загружать всю эту страницу в виде отдельного файла.

В прошлом я использовал веб-клиент для этого:

 Dim myWebClient As New System.Net.WebClient
myWebClient.DownloadFile(strSource, strDest)
Response.AddHeader("Content-Disposition", "attachment;filename=test.doc")
Response.Write("test.doc")
  

но, похоже, это позволяет загружать только HTML-страницы.

Можно ли это сделать?

Комментарии:

1. Почему это было помечено? Вопрос казался справедливым и ясным.

Ответ №1:

Причина, по которой вы можете загружать только HTML, заключается в том, что .aspx не передается через Интернет (доступен только результирующий HTML).

Когда вы выполняете myWebClient.DownloadFile() , приложение просто отправляет запрос GET в URI и сохраняет полученный HTML-код. .aspx никогда не покидает сервер — скорее, он обрабатывается на стороне сервера, в результате чего получается HTML, с которым вы в конечном итоге.

Комментарии:

1. Если у вас нет доступа к серверу, вы ничего не сможете сделать

Ответ №2:

.ASPX — это страница со сценарием, поэтому вы не можете фактически загрузить оригинальный ASPX. Сервер IIS на другом конце имеет обработчик для .aspx, в результате чего .NET обрабатывает его. Как правило, вы не хотите, чтобы сервер возвращал необработанный исходный код ASPX.

Для получения необработанной страницы ASPX потребовалась бы специальная обработка на стороне сервера. Например, вы могли бы создать обработчик скрипта ASHX, который сделает это за вас, вы бы запросили что-то вроде getfile.ashx?filename=myfile.aspx и обработчик getfile.ashx прочитал бы страницу ASPX с диска и записал это в качестве ответа. (Примечание по безопасности: Если вы выбрали именно этот маршрут, обязательно очистите указанную страницу, чтобы они не сделали что-нибудь глупое вроде getfile.ashx?filename=C:mysecretfile.txt ) Было бы еще лучше установить уровень доверия для этого обработчика на средний или ниже.

Но для всего этого требуется разработка на стороне сервера. Со стороны клиента вы ничего не можете сделать, пока сервер не захочет подыграть.

Вот пример обработчика файлов:

 public class MyHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        var file = context.Request.QueryString["file"];
        //Make sure to do your security checks on the file path here.
        using (var source = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            source.CopyTo(context.Response.OutputStream);
        }
    }
}
  

Вы можете настроить обработчик либо внутри ASHX, либо через httpHandlers раздел в web.config.

Или, если вы используете MVC2 , вам не нужен HTTP-обработчик, поскольку вы можете просто использовать действие для достижения того же результата:

 public ActionResult GetFile(string path)
{
    //Make sure to do your security checks
    using (var source = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        return File(source, "text/html");
    }
}