Локальная загрузка XML-файла через C#, переданная в AngularJS, не работает

#c# #angularjs #typescript

Вопрос:

У меня есть метод в серверной части C#, который извлекает XML-файл

 string filePath = "c:\Users\"   User.Identity.Name   "\.SCADAPRO\WEBHMI\DASHBOARDS\"   "Horizontal1.xml";

            if (!System.IO.File.Exists(filePath))
            {
                Debug.WriteLine("No trend exists at the path: {0}", filePath);
                return new HttpResponseMessage(HttpStatusCode.BadRequest);
            }
            else if (System.IO.File.Exists(filePath))
            {
                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                
                Byte[] bytes = System.IO.File.ReadAllBytes(filePath);

                response.Content = new ByteArrayContent(bytes);
                response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
                response.Content.Headers.ContentDisposition.FileName = "trend";

                return response;

            }
            else
            { 
                return new HttpResponseMessage(HttpStatusCode.BadRequest);
            }
 

В классе директивы AngularJS я вызываю метод из службы

 public openExportTrendDialog(): void {
            // Add download code here 
            var exportedXML = this.trendService.downloadActiveTrend();
            exportedXML.then(function (result) {

                console.log(result);
                // Create the file
                var file = new Blob([result.data], { type: 'text/xml' });
                var fileURL = window.URL.createObjectURL(file);
                // need to get actual file name for here
                var fileName = "trend.xml";
                var a = document.createElement("a");
                document.body.appendChild(a)
                a.href = fileURL;
                a.download = fileName;
                a.click();

            })

        };
 

Загрузка работает, однако единственным содержимым, которое появляется в файле, является » [объект объекта]».

Услуга приведена ниже. В конце концов в это будет передано имя файла, но сначала я хочу, чтобы загрузка работала правильно

 public downloadActiveTrend() {

            var urlPath = this.urlHelper.getPath(App.UrlHelper.Path.DownloadExportTrend);

            console.log(urlPath);

            var promise = this.$http({
                method: 'POST',
                url: urlPath,
                responseType: 'arraybuffer'

            })

            promise.success(function (data) {
                console.log(data);
                return data;
            }).error(function (data, status) {
                console.log("Request failed with status: "   status)
            })

            return promise;
        }
 

Комментарии:

1. Какой стек вы используете? Веб-формы? MVC? Бритвенные страницы? Веб-API? Ты мог бы. использовали только return File(filePath,"text/xml","trend.xml");

2. downloadActiveTrend файл тоже не возвращается. Ответ регистрируется, но никогда не проверяется и не возвращается

3. Использование библиотеки классов net framework с интерфейсом angularjs

4. Это вообще ни о чем не говорит. ASP.NET Веб-формы? MVC? Бритвенные страницы? Все они работают на платформе .NET Framework. Начиная с MVC, самый простой способ вернуть файл-это записать return File(...) его в действие. В браузере вы должны фактически вернуть большой двоичный объект ответа. Прямо сейчас вы возвращаете результат console.log

5. В Javascript вы можете использовать fetch и Response.blob() во всех браузерах, нет необходимости во внешней библиотеке. Вам нужно будет проверить документы вашей библиотеки, чтобы узнать, как вы можете извлечь файл из response