简体   繁体   English

Web API从javascript下载xml文件

[英]web api download xml file from javascript

I try to use web api to return a list of items. 我尝试使用Web API返回项目列表。

This is my Controller : 这是我的控制器:

public class RecipesController : ApiController
{
    /// <summary>
    /// Model to get recipes datas
    /// </summary>
    private readonly RecipeModel _recipeModel = new RecipeModel();

    /// <summary>
    /// Gets the recipe by division identifier.
    /// </summary>
    /// <param name="id">The div identifier.</param>
    [ActionName("Division")]
    public Adoria GetRecipeByDivisionId(int id)
    {
        return _recipeModel.GetRecipeByDivisionId(id);
    }
}

For the moment, this is called by an ASP page using JavaScript : 目前,这是由使用JavaScript的ASP页面调用的:

function RedirectToReport(){
var url = $("#valSelectedCheckBox").val(); // url of my web api method
location.href = url;
}

It displays the xml file on the browser. 它在浏览器上显示xml文件。

I don't want to display it on the browser but download it. 我不想在浏览器上显示它,而是下载它。

Do you have an idea of the purpose ? 您对目的有想法吗?

Create this ActionResult (so it's reusable from elsewhere in your app). 创建此ActionResult(以便可在应用程序的其他位置重用)。 I took a starting point from http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ActionResults/ActionResults/Results/OkFileDownloadResult.cs , this site has many more useful examples. 我从http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ActionResults/ActionResults/Results/OkFileDownloadResult.cs开始,此站点有许多有用的示例。

public class OkXmlDownloadResult : IHttpActionResult
{
    private readonly ApiController _controller;

    public OkXmlDownloadResult(string xml, string downloadFileName,
        ApiController controller)
    {
        if (xml == null)
        {
            throw new ArgumentNullException("xml");
        }

        if (downloadFileName == null)
        {
            throw new ArgumentNullException("downloadFileName");
        }

        if (controller == null)
        {
            throw new ArgumentNullException("controller");
        }

        Xml = xml;
        ContentType = "application/xml";
        DownloadFileName = downloadFileName;
        _controller = controller;
    }

    public string Xml { get; private set; }

    public string ContentType { get; private set; }

    public string DownloadFileName { get; private set; }

    public HttpRequestMessage Request
    {
        get { return _controller.Request; }
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(Execute());
    }

    private HttpResponseMessage Execute()
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = new StringContent(Xml);
        response.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(ContentType);
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = DownloadFileName
        };
        return response;
    }
}

Then use it in your controller (I added a simple way to get the XML, it's up to you how to get generate it): 然后在控制器中使用它(我添加了一种获取XML的简单方法,这取决于您如何生成XML):

public class ValuesController : ApiController
{
    public IHttpActionResult Get()
    {
        User user = new User()
        {
            FirstName = "First",
            LastName = "Last"
        };

        // Alternative 1
        XmlSerializer serializer = new XmlSerializer(typeof(User));

        // Alternative 2
        // DataContractSerializer serializer = new DataContractSerializer(typeof(User));

        StringBuilder builder = new StringBuilder();
        using (StringWriter writer = new StringWriter(builder))
        {
            serializer.Serialize(writer, user);

            // alternative 2
            // serializer.WriteObject(writer, user);
        }

        // create XML from your data.
        return new OkXmlDownloadResult(builder.ToString(), "myfile.xml", this);
    }
}

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Try the following code 试试下面的代码

public class RecipesController : ApiController
{
    private readonly RecipeModel _recipeModel = new RecipeModel();

    [ActionName("Division")]
    public HttpResponseMessage GetRecipeByDivisionId(int id)
    {
        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);

        var adoria = _recipeModel.GetRecipeByDivisionId(id);

        XmlSerializer serializer = new XmlSerializer(typeof(Adoria));
        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream))
            {
                serializer.Serialize(xmlWriter, adoria);
            }

            result.Content = new StreamContent(memoryStream);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

            return result;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM