首页 > 解决方案 > ASP.Net 核心重定向到返回 FileStreamResult 的操作

问题描述

我必须在控制器中采取行动:

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{

    [HttpGet("redirect1")]
    public IActionResult Redirect1()
    {
        var r = RedirectToAction(nameof(GetStream));
        return r;
    }


    [HttpGet("stream")]
    public IActionResult GetStream()
    {
        var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello Word"));
        return File(ms, "application/octet-stream", "test.xyz", true);            
    }
}

当我键入https://localhost:44352/api/values/redirect1时,另存为对话框打开以供下载,但浏览器中的 url 未更改为https://localhost:44352/api/values/stream. 也是一种更改网址的方法。如果GetStream操作返回 json,则 url 将更改为https://localhost:44352/api/values/stream. 如果我返回,怎么可能更改 url FileStreamResult

有可能在视图中有一些东西,比如“等待......”并返回FileStreamResult

标签: c#asp.net-coreasp.net-web-apiroutingfilestreamresult

解决方案


如果我返回 FileStreamResult,怎么可能更改 url?

您可以返回一个 HTML 来制作它:

公共 IActionResult Redirect1()
{
    var r = RedirectToAction(nameof(GetStream)); 
    返回 r;                                   
    var url = this.Url.Action(nameof(GetStream));    
    返回内容(
        $"<script>history.pushState({{}},'downloading','{url}');history.go()</script>",
        “文本/html”
    );
}

关键是从 JavaScript 拼写魔法,这样您就可以随心所欲地改变浏览器的行为。

视图中可能有一些东西,比如“等待......”并返回 FileStreamResult

同样,您可以通过 HTML 内容来做到这一点。假设您要显示一条 waiting...消息并在 1 秒内触发下载:

public IActionResult Redirect1()
{
    var url = this.Url.Action(nameof(GetStream));
    return Content($"<div id='msg'>waiting...</div><script>history.pushState({{}},'downloading','{url}'); setTimeout(function(){{document.getElementById('msg').textContent='';history.go();}}, 1000);</script>","text/html");
}

如果你的 javascript 变得更复杂怎么办?只需创建一个cshtml视图并将内容放在视图文件中。


推荐阅读