api控制器的文件下载问题

Kur*_*ula 8 c# asp.net-mvc asp.net-web-api angularjs

public class DefaultController : Controller
{
    // GET: Default
    public ActionResult Index()
    {
        return Download();
    }

    public FileResult Download()
    {
        string xmlString = "my test xml data";
        string fileName = "test" + ".xml";
        return File(Encoding.UTF8.GetBytes(xmlString), "application/xml", fileName);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在asp.net mvc应用程序中有上面的代码来下载文件.它工作正常,因为我的控制器继承到Controller.但是,当我将此代码移动到Webapi控制器时,它会在返回File时抛出错误.经过分析,我发现webapi中的控制器继承到ApiController(system.web.http.api控制器).我发现ApiController中没有File类.有没有选项在webapi控制器中实现下载文件功能?

我在webapi控制器中尝试了下面的替代代码,但是一旦我调用它就看不到下载文件.

public HttpResponseMessage DownloadConstructedXmlFile()
        {
            var result = new HttpResponseMessage(HttpStatusCode.OK);
            string xmlContent = "My test xml data";
            //var serializer = new XmlSerializer(typeof(xmlContent));

            var builder = new StringBuilder();
            using (var writer = new StringWriter(builder))
            {
                // serializer.Serialize(writer, xmlContent);
                result.Content = new StringContent(xmlContent, Encoding.UTF8, "application/xml");
                result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                {
                    FileName = string.Format("test.xml")
                };
               // return result;
            }

            return new HttpResponseMessage();
        }
Run Code Online (Sandbox Code Playgroud)

PS:我正在尝试使用angularjs代码通过角度服务调用此api.这是在下载按钮单击时调用的.api控制器代码或建议中的任何示例角度代码或帮助都会有所帮助.

Jon*_*han 11

这是一个更简单的例子:

   using System.Net;
   using System.Net.Http;
   using System.Net.Http.Headers;
   using System.Text;
   using System.Web.Http;

   namespace WebApplication1.Controllers
   {
    public class ValuesController : ApiController
    {
        // GET: api/Values
        public HttpResponseMessage Get()
        {
            var xmlString = "<xml><name>Some XML</name></xml>";
            var result = Request.CreateResponse(HttpStatusCode.OK);
            result.Content = new StringContent(xmlString, Encoding.UTF8, "application/xml");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "test.xml"
            };

            return result;
        }
    }
   }
Run Code Online (Sandbox Code Playgroud)