Fuerza la descarga de un archivo en el servidor web – ASP .NET C #

Necesito forzar la iniciación de la descarga de un archivo .sql, cuando el usuario hace clic en un botón en mi aplicación web ASP .NET (C #).

Como en, cuando se hace clic en el botón, se debe abrir un diálogo de guardar como en el extremo del cliente …

¿Cómo hago esto?

EDITAR

Este es el código que estoy usando

string sql = ""; using (System.IO.StreamReader rdr = System.IO.File.OpenText(fileName)) { sql = rdr.ReadToEnd(); } Response.ContentType = "text/plain"; Response.AddHeader("Content-Disposition", "attachment; filename=Backup.sql"); Response.Write(sql); Response.End(); 

Este es el error que estoy recibiendo …

texto alternativo http://img40.imageshack.us/img40/2103/erroro.gif

¿Qué pasa?

Cree un controlador HTTP separado (https://stackoverflow.com/questions/873207/force-download-of-a-file-on-web-server-asp-net-c-sharp/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; } } } 

Luego, haga que el botón en su página ASP.NET vaya a https://stackoverflow.com/questions/873207/force-download-of-a-file-on-web-server-asp-net-c-sharp/DownloadSqlFile.ashx .

Debe decirle al navegador que lo que está enviando no es html y no debe mostrarse como tal en el navegador. El siguiente código se puede utilizar para devolver algo de texto en el código del lado del servidor y presentará el diálogo de guardar al usuario como lo deseaba:

 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 : el nombre que desea darle

yourSQL : el contenido del archivo sql

El problema es que estás usando el código en la misma página que está cargado actualmente en el navegador. Está intentando modificar la secuencia de respuesta y la disposición de la página cargada actual. En su lugar, crea un HttpHandler por separado, como lo sugiere Mehrdad. Luego, al hacer clic en el botón, invocará la URL al controlador. El botón podría ser incluso un hipervínculo simple que tenía la siguiente URL fuente:

 Download SQL 

¿Tener sentido? El punto es que no puede modificar la respuesta de la página ya cargada . Inicie una nueva solicitud utilizando un controlador para hacer el trabajo.

Agregue una Response.Clear antes de Response.Write para corregir el error, si se indica correctamente en el cuadro de diálogo de Chrome.

Entonces, para integrar en el fragmento en otra respuesta …

 //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; 

La solución a continuación funciona para mí

 string fileNameAndExtension = "thisFile.pdf"; string fullPath = "../folder/files/" + fileNameAndExtension; Response.Clear(); Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileNameAndExtension ); Response.TransmitFile(fullPath); Response.End();