ASP.Net 框架 4.7 的问题。 Return 文件。没有下载提示

Problem with ASP.Net framwork 4.7. Return file. No download prompt

我正在制作一个控制器,用于 return 基于数据库中模型的文件,但我在获取下载文件的提示时遇到问题。控制器看起来像这样 atm:

public ActionResult CreateFile(string ID) 
    {
        int id = int.Parse(licneseFileID);
        File_Type file = db.Files.FirstOrDefault(li => li.ID == id);
        string fileName = Path.Combine(Server.MapPath(@"~\App_Data\TempData"), file.NAME.Replace(" ", string.Empty) + ".lic");
        
        WriteFile(fileName) //Here the file is created and its content is writen based on the data model

        ProcessStartInfo startInfo = new ProcessStartInfo(Server.MapPath(@"~\rlmsign12.exe"), fileName); 
        
        Process.Start(startInfo); //im runnig a 3rd party .exe to sign the file for licensing

        try
        {
            Debug.WriteLine("Works?");
            return File(fileName, MimeMapping.GetMimeMapping(fileName), System.IO.Path.GetFileName(fileName)); //The problem is here. Getting no download when it runs. filename is a full path.
        }
        catch (Exception)
        {
            Debug.WriteLine("Fail");
            throw;
        }
        finally
        {
            //send file to blob here if we are going to be using a blob.
            //System.IO.File.Delete(fileName); //Delete file from application to avoid filling it upp with files. Send to local storage? Extra backup
        }
    }

解释一下。

从数据库中获取文件

将路径保存到“文件名”。

运行 它通过在App_Data 的子文件夹中创建文件然后写入文件内容的方法。 使用第 3 方软件签署文件。

将文件发送给用户。 <-这就是问题所在。

删除文件

所以问题是当我 运行 控制器没有通过客户端收到下载提示时。 我知道 return 语句不会失败,因为它不会抛出异常。我检查了下载,没有任何内容。

我尝试关闭 chrome 安全性。

我试过 return 文件作为字节数组。我也尝试了一些不同的内容类型。

我是否遗漏了一些明显的东西,比如方法的属性?

该方法目前 运行 直接由控制器中的索引方法 class (带有硬编码参数)用于测试目的。

编辑: IE 在加载页面时调用它。

public ActionResult Index()
    {
        CreateFile("2");
        return View(db.LICENSE_FILES.ToList());
    }

Peter B 的评论提出了一些非常明显的问题。我在视图 returned 之前调用该方法。从我写的时候遗留下来的。

编辑 2: 尝试使用 Jquery:

调用操作
<script>
function call()
{
    $.ajax
    ({
        url: '/LicenseFiles/CreateFile',
        data: { licneseFileID: "2" }
    })
    .done(function ()
    {
        alert('test');
    })
}
我可以在网络选项卡中调用该操作,但我没有收到保存文件的提示,也没有下载任何内容。

您的第一次尝试(从 Index 调用 CreateFile)不会成功,您似乎已经明白原因了。相反,将 重定向 CreateFile 会起作用,但是文件下载将是对 Index 调用的最终响应,并且没有新的将显示视图。

第二次尝试无效,因为下载只有在浏览器完成请求时才会“发生”window。使用 $.ajax 时,发出请求的是 XMLHttpRequest 对象,它将接收数据,然后由您提取数据,例如将它变成一个 Blob 以供下载 - 不是很容易或方便。

一个更简单的解决方案是:

window.location = "/CreateFile/2";

或可能(取决于您的路由):

window.location = "/CreateFile?id=2";