Asp.net mvc Azure Web应用程序上的响应标头问题

Asp.net mvc Azure Web应用程序上的响应标头问题,asp.net-mvc,azure-web-app-service,response-headers,Asp.net Mvc,Azure Web App Service,Response Headers,我不确定这里发生了什么 当我在本地运行我的web应用程序并单击一个按钮下载一个文件时,该文件会被很好地下载,并显示响应标题,正如您在所附的屏幕截图中看到的,其中显示为local 但当我将应用程序发布到azure web app时。不知何故,下载按钮停止工作。我检查了响应标题,您可以看到差异 什么会导致这个问题?代码是一样的吗?在azure门户的azure web app中是否有我应该设置的任何设置 更新以添加代码 我已经远程调试,以了解@Amor建议的情况 奇怪的是,当我在本地机器上调试时,第

我不确定这里发生了什么

当我在本地运行我的web应用程序并单击一个按钮下载一个文件时,该文件会被很好地下载,并显示响应标题,正如您在所附的屏幕截图中看到的,其中显示为local

但当我将应用程序发布到azure web app时。不知何故,下载按钮停止工作。我检查了响应标题,您可以看到差异

什么会导致这个问题?代码是一样的吗?在azure门户的azure web app中是否有我应该设置的任何设置

更新以添加代码

我已经远程调试,以了解@Amor建议的情况

奇怪的是,当我在本地机器上调试时,第一个ExportTo操作被命中,它准备了TempData,然后下载操作在第一个操作通过ajax调用完成后被调用

但是,远程调试时并非如此。不知何故,ExportToAction从未被调用。它直接调用下载操作。因此,TempData null检查始终为null

但是为什么呢?究竟为什么以及这是如何可能的?有什么东西藏在什么地方吗

我已经在远程删除了web应用程序的内容,并重新发布了所有内容,以确保所有内容都得到更新。但仍然没有成功

代码如下:

[HttpPost]
    public virtual ActionResult ExportTo(SearchVm searchVm)
    {
        var data = _companyService.GetCompanieBySearchTerm(searchVm).Take(150).ToList();

        string handle = Guid.NewGuid().ToString();
        TempData[handle] = data;
        var fileName = $"C-{handle}.xlsx";
        var locationUrl = Url.Action("Download", new { fileGuid = handle, fileName });

        var downloadUrl = Url.Action("Download");

        return Json(new { success = true, locationUrl, guid = handle, downloadUrl }, JsonRequestBehavior.AllowGet);

    }

        [HttpGet]
    public ActionResult Download(string fileGuid, string fileName)
    {
        if (TempData[fileGuid] != null)
        {
            var fileNameSafe = $"C-{fileGuid}.xlsx";
            var data = TempData[fileGuid] as List<Company>;

            using (MemoryStream ms = new MemoryStream())
            {
                GridViewExtension.WriteXlsx(GetGridSettings(fileNameSafe), data, ms);
                MVCxSpreadsheet mySpreadsheet = new MVCxSpreadsheet();
                ms.Position = 0;
                mySpreadsheet.Open("myDoc", DocumentFormat.Xlsx, () =>
                {
                    return ms;
                });
                mySpreadsheet.Document.Worksheets.Insert(0);
                var image = Server.MapPath("~/images/logo.png");
                var worksheet = mySpreadsheet.Document.Worksheets[0];
                worksheet.Name = "Logo";
                worksheet.Pictures.AddPicture(image, worksheet.Cells[0, 0]);
                byte[] result = mySpreadsheet.SaveCopy(DocumentFormat.Xlsx);
                DocumentManager.CloseDocument("myDoc");
                Response.Clear();

                //Response.AppendHeader("Set-Cookie", "fileDownload=true; path=/");
                Response.ContentType = "application/force-download";
                Response.AddHeader("content-disposition", $"attachment; filename={fileNameSafe}");
                Response.BinaryWrite(result);
                Response.End();
            }
        }

        return new EmptyResult();
    }
单击导出按钮时,调用导出数据函数:

 var exportToLink = '@Url.Action("ExportTo")';
            console.log('Export to link  in index: '+exportToLink);
            SearchController.exportData(exportToLink);
正如我提到的,这段代码在本地机器上工作得非常好。azure webapp上发生了一些奇怪的事情,ExportTo操作断点从未被命中


我不确定还有什么可以更改以使ExportTo操作成功?

根据Azure Web App的响应头,我们发现内容长度的值为0。这意味着web应用服务器端没有发送任何数据

在ASP.NETMVC中,我们可以使用以下方法响应文件

第一种方式,发送服务器上承载的文件。为此,请检查excel文件是否已上载到Azure Web App。您可以使用Kudu或FTP到文件夹来检查文件是否存在

string fileLocation = Server.MapPath("~/Content/myfile.xlsx");
string contentType = System.Net.Mime.MediaTypeNames.Application.Octet;
string fileName = "file.xlsx";
return File(fileLocation, contentType, fileName);
第二种方式,我们可以从任何位置(数据库、服务器或azure存储)读取文件,并将文件内容发送到客户端。为此,请检查文件是否已成功读取。您可以检查文件内容是否以正确的方式读取

byte[] fileContent = GetFileContent();
string contentType = System.Net.Mime.MediaTypeNames.Application.Octet;
string fileName = "file.xlsx";
return File(fileContent, contentType, fileName);
2017年5月27日更新

不知何故,ExportToAction从未被调用。它直接调用下载操作。因此,TempData null检查始终为null

您的Web应用分配了多少实例?如果您的Web应用有多个实例,则ExportTo请求由一个实例处理,下载请求由另一个实例处理。由于TempData存储在专用实例的内存中,因此无法从其他实例获取。根据远程调试文档。我找到了Exporto action从未被调用的原因

如果您确实有多个web服务器实例,当您连接到调试器时,您将获得一个随机实例,并且您无法确保后续浏览器请求将转到该实例


要解决此问题,我建议您直接从ExportTo操作响应数据,或将临时数据保存在Azure blob存储中,该存储无法从多个实例访问。

根据Azure Web App的响应标头,我们发现内容长度的值为0。这意味着web应用服务器端没有发送任何数据

在ASP.NETMVC中,我们可以使用以下方法响应文件

第一种方式,发送服务器上承载的文件。为此,请检查excel文件是否已上载到Azure Web App。您可以使用Kudu或FTP到文件夹来检查文件是否存在

string fileLocation = Server.MapPath("~/Content/myfile.xlsx");
string contentType = System.Net.Mime.MediaTypeNames.Application.Octet;
string fileName = "file.xlsx";
return File(fileLocation, contentType, fileName);
第二种方式,我们可以从任何位置(数据库、服务器或azure存储)读取文件,并将文件内容发送到客户端。为此,请检查文件是否已成功读取。您可以检查文件内容是否以正确的方式读取

byte[] fileContent = GetFileContent();
string contentType = System.Net.Mime.MediaTypeNames.Application.Octet;
string fileName = "file.xlsx";
return File(fileContent, contentType, fileName);
2017年5月27日更新

不知何故,ExportToAction从未被调用。它直接调用下载操作。因此,TempData null检查始终为null

您的Web应用分配了多少实例?如果您的Web应用有多个实例,则ExportTo请求由一个实例处理,下载请求由另一个实例处理。由于TempData存储在专用实例的内存中,因此无法从其他实例获取。根据远程调试文档。我找到了Exporto action从未被调用的原因

如果您确实有多个web服务器实例,当您连接到调试器时,您将获得一个随机实例,并且您无法确保后续浏览器请求将转到该实例


要解决此问题,我建议您直接从ExportTo操作响应数据,或将临时数据保存在Azure blob存储中,该存储无法从多个实例访问。

感谢@Amor的回答。我已更新我的问题以添加代码。我在azure web应用程序上进行了远程调试,我可以看到一个问题,正如我在问题中详述的那样。知道为什么会发生这种情况吗?我不知道azure为web应用程序创建了任何实例。我想你在这件事上救了我。我已禁用web应用程序的ARR关联。现在一切都变得更有意义了。因此,如果您禁用了ARR关联,正如您所说的,如果您的应用程序不是完全无状态的(例如有tempdata等),那么调试是非常无用的。但是有人应该写一篇关于这个很棒的想法的博客来警告人们。回到问题上来,无法响应ExportTo操作中的数据,因为它是通过ajax调用来传递筛选器数据的。简单的解决方案似乎是在azure portal中为ap启用ARR关联