Search code examples
asp.net-mvchttp-headersasp.net-web-api2export-to-csvasp.net-apicontroller

ASP.Net ApiController how replace Controller.Response


I have a method, that was written in ASP.net MVC Controller:

[HttpGet]
        public void ExportClientsListToCSV()
        {
            Response.Clear();
            Response.ClearHeaders();
            Response.ClearContent();
            Response.AddHeader("content-disposition", "attachment;filename=Exported_Contacts.csv");
            Response.ContentType = "text/csv";
            Response.ContentEncoding = Encoding.Unicode;
            Response.BinaryWrite(Encoding.Unicode.GetPreamble());
            StringWriter sw = new StringWriter();
            sw.WriteLine("\"FullName\",\"Position\",\"BranchOffice\",\"PrivateEmail\"");
            foreach (var line in db.Persons)
            {
                sw.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\"",
                                           line.FullName,
                                           line.Position,
                                           line.BranchOffice,
                                           line.PrivateEmail);
            }
            Response.Write(sw.ToString());
            Response.End();
        }

I want to use it in ApiController, but in ApiController there is no member Response. How can I replace it? There is HttpResponseMessage, but I can't do the same thing with it.
Thank you for help!


Solution

  • The following code should be equivalent:

    var sw = new StringWriter();
    sw.WriteLine("\"FullName\",\"Position\",\"BranchOffice\",\"PrivateEmail\"");
    foreach (var line in db.Persons)
    {
        sw.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\"",
            line.FullName,
            line.Position,
            line.BranchOffice,
            line.PrivateEmail);
    }
    
    return new HttpResponseMessage
    {
        Content = new StringContent(sw.ToString(), Encoding.Unicode)
        {
            Headers =
            {
                ContentType = new MediaTypeHeaderValue("text/csv"),
                ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = "Exported_Contacts.csv"
                }
            }
        },
        StatusCode = HttpStatusCode.OK
    };