Api Web - Cómo detectar cuando una respuesta ha terminado de ser enviado

votos
9

En un método Web API estoy generando un archivo y luego streaming a la respuesta como tal

public async Task<HttpResponseMessage> GetFile() {
    FileInfo file = generateFile();
    var msg = Request.CreateResponse(HttpStatusCode.OK);

    msg.Content = new StreamContent(file.OpenRead());
    msg.Content.Headers.ContentType = new MediaTypeHeaderValue(application/pdf);
    msg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(attachment) {FileName = file.Name};

    return msg;
}

porque esto genera un archivo que quiero borrarlo después de la respuesta ha terminado el streaming pero me parece que no puede encontrar un gancho en la tubería para esto.

Supongo que puedo poner una referencia al archivo en una estática y establecer un MessageHandler a medida que tira de los valores de esta misma variable estática y elimina. Sin embargo, esto parece que no puede estar en lo cierto, tanto por el uso de una estática (cuando debería de ser todo por solicitud) y porque tendría que registrarse una ruta separada.

He visto esta pregunta pero no parece tener realmente mucho de una respuesta útil.

Publicado el 22/11/2013 a las 02:55
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
10

escenario agradable! ... el problema con el uso de controladores de mensajes es que la escritura respuesta sucede en las capas de acogida y por debajo de la capa de controladores de mensajes, por lo que no son ideales ...

Lo que sigue es un ejemplo de cómo podría hacerlo:

msg.Content = new CustomStreamContent(generatedFilePath);

public class CustomStreamContent : StreamContent
{
    string filePath;

    public CustomStreamContent(string filePath)
        : this(File.OpenRead(filePath))
    {
        this.filePath = filePath;
    }

    private CustomStreamContent(Stream fileStream)
        : base(content: fileStream)
    {
    }

    protected override void Dispose(bool disposing)
    {
        //close the file stream
        base.Dispose(disposing);

        try
        {
            File.Delete(this.filePath);
        }
        catch (Exception ex)
        {
            //log this exception somewhere so that you know something bad happened
        }
    }
}

Por cierto, estás generando este archivo porque va a convertir algunos datos en formato PDF. Si es así, creo que se podría utilizarPushStreamContent para este propósito escribiendo directamente los datos convertidos en la secuencia de respuesta. De esta manera usted no tiene que generar un archivo primero y luego preocuparse por eliminarlo después.

Respondida el 22/11/2013 a las 04:01
fuente por usuario

votos
0

Se realizó misma acción en WebAPI. Que necesitaba para borrar el archivo descargado justo después de que el servidor formulario. Podemos crear clase de mensaje de respuesta personalizado. Se toma la ruta del archivo como parámetro y borrar de una vez su transmitida.

 public class FileResponseMessage : HttpResponseMessage
    {
        private readonly string _filePath;

        public FileHttpResponseMessage(string filePath)
        {
            this._filePath= filePath;
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            Content.Dispose();
            File.Delete(_filePath);
        }
    }

Utilice esta clase como continuación de código y se eliminará el archivo una vez que se escribirá en la secuencia de respuesta.

 var response = new FileResponseMessage(filePath);
 response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(new FileStream(filePath, FileMode.Open, FileAccess.Read));
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
  FileName = "MyReport.pdf"
};
 return response;
Respondida el 29/05/2015 a las 05:53
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more