Создайте отдельный обработчик HTTP (DownloadSqlFile.ashx):
<%@ WebHandler Language="C#" Class="DownloadHandler" %>
using System;
using System.Web;
public class DownloadHandler : IHttpHandler {
public void ProcessRequest(HttpContext context) {
var fileName = "myfile.sql";
var r = context.Response;
r.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
r.ContentType = "text/plain";
r.WriteFile(context.Server.MapPath(fileName));
}
public bool IsReusable { get { return false; } }
}
Затем с помощью кнопки на странице ASP.NET перейдите к DownloadSqlFile.ashx
.
Проблема в том, что вы используете код на той же странице, которая в данный момент загружена в браузер. Вы пытаетесь изменить поток ответов и расположение текущей загруженной страницы. Вместо этого создайте отдельный HttpHandler, как предложил Мехрдад. Затем, нажав кнопку, вы вызовете URL-адрес обработчика. Кнопка может быть даже простой гиперссылкой, исходный URL которой имеет следующий вид:
<a href="DownloadSqlFile.ashx">Download SQL</a>
Имеет смысл? Дело в том, что вы не можете изменить ответ уже загруженной страницы . Запустите новый запрос, используя обработчик для выполнения работы.
Вам необходимо сообщить браузер, что отправляемое вами сообщение не является HTML и не должно отображаться как таковое в браузере. Следующий код может быть использован для возврата некоторого текста в вашем серверном коде, и он представит пользователю диалоговое окно сохранения, как вы хотели:
Response.Clear(); //eliminates issues where some response has already been sent
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename));
Response.Write(yourSQL);
Response.End();
filename
: имя, которое вы хотите дать ему
yourSQL
: содержимое файла sql
Добавьте Response.Clear
перед Response.Write
, чтобы исправить ошибку, если правильно указано в диалоговом окне Chrome.
Итак, чтобы интегрировать во фрагмент в другом ответе ...
//add this
Reponse.Clear();
//from other answer
Response.ContentType = "text/plain";
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}.sql", filename));
Response.Write(yourSQL);
Response.End;