You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#返回本地XML文件至AngularJS下载出现[object Object]问题求解

问题原因
  • 核心原因是AngularJS默认的响应转换逻辑:你后端返回的Content-Type为text/xml,AngularJS会自动将响应内容解析为XML Document对象,即便你配置了responseType: 'arraybuffer',默认的响应转换器仍然会覆盖配置的返回类型,最终你拿到的result.data是XML对象而非二进制流。
  • 将XML对象传入Blob构造函数时,Blob会自动调用对象的toString()方法,序列化结果就是你看到的[object Object]。
  • 额外的写法问题:你使用的success/error是AngularJS废弃的回调语法,且该回调的返回值不会传递到外层的then,也可能导致数据传递异常。
解决方法

前端修改(核心修复)

1. 调整服务层请求代码

禁用AngularJS默认的响应转换器,保留二进制返回类型,同时废弃过时的success/error写法:

public downloadActiveTrend() {
    var urlPath = this.urlHelper.getPath(App.UrlHelper.Path.DownloadExportTrend);
    console.log(urlPath);
    // 直接返回$http的promise,不需要额外包一层
    return this.$http({
        method: 'POST',
        url: urlPath,
        responseType: 'arraybuffer',
        transformResponse: [] // 加这行禁用默认响应转换,防止xml被解析为DOM对象
    }).catch(function (response) {
        console.log("Request failed with status: " + response.status);
        throw response;
    });
}

2. 可选优化:直接返回Blob类型

如果觉得arraybuffer处理麻烦,也可以直接将responseType改成blob,后续不需要额外转Blob,还可以补充内存释放逻辑避免泄漏:

public downloadActiveTrend() {
    var urlPath = this.urlHelper.getPath(App.UrlHelper.Path.DownloadExportTrend);
    return this.$http({
        method: 'POST',
        url: urlPath,
        responseType: 'blob',
        transformResponse: []
    }).catch(response => {
        console.log("Request failed with status: " + response.status);
        throw response;
    });
}
// 对应调用层代码可以简化为:
public openExportTrendDialog(): void {
    this.trendService.downloadActiveTrend().then(function (result) {
        var fileURL = window.URL.createObjectURL(result.data);
        var fileName = "trend.xml";
        var a = document.createElement("a");
        document.body.appendChild(a);
        a.href = fileURL;
        a.download = fileName;
        a.click();
        // 用完释放url,避免内存泄漏
        window.URL.revokeObjectURL(fileURL);
        document.body.removeChild(a);
    })
};

后端可选优化

调整返回的文件名补全后缀,更符合下载规范:

response.Content.Headers.ContentDisposition.FileName = "trend.xml";

内容的提问来源于stack exchange,提问作者Ronan Duffy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:30:00