ASP.Net核心重定向到返回FileStreamResult的操作

时间:2019-09-25 06:48:34

标签: c# asp.net-core asp.net-web-api routing 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。万一我返回FileStreamResult,还可能如何更改网址。

可能在视图中包含诸如“正在等待...”之类的内容并返回FileStreamResult

2 个答案:

答案 0 :(得分:0)

  

在我返回FileStreamResult的情况下,如何更改URL?

您可以返回HTML以使其:

public IActionResult Redirect1()
{
    var r = RedirectToAction(nameof(GetStream));
    return r;                                   
    var url = this.Url.Action(nameof(GetStream));    
    return Content(
        $"<script>history.pushState({{}},'downloading','{url}');history.go()</script>",
        "text/html"
    );
}

关键是通过JavaScript拼写魔术,以便您可以随意更改浏览器的行为。

  

可能在视图中包含诸如“ waiting ...”之类的内容并返回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视图,然后将内容放入视图文件中即可。

答案 1 :(得分:0)

谢谢, 也许我不得不描述更多我的问题。 我有一个操作,该操作返回FileFileStreamResult并已使用OpenIdConnect和IdentityServer4 Authority授权。从新标签中的angular Web应用程序中调用此操作。如果浏览器知道mime类型将显示流的内容,否则将显示保存对话框,并且该选项卡被浏览器关闭。除非第一次完成身份验证,否则浏览器不会自动关闭选项卡,因为浏览器的URL不会更新,因此该工作非常完美。 开发工具中的URL顺序为:

  1. https://taxmart-portal-dev-v2.taxmaxng.eu/api/active-data-marts/21933e46-c4e5-44cc-b49b-a6bf3636ba44/objects/11/content
  2. https://taxmart-identity-dev-v2.taxmaxng.eu/connect/authorize?client_id= ...
  3. https://taxmart-portal-dev-v2.taxmaxng.eu/signin-oidc
  4. https://taxmart-portal-dev-v2.taxmaxng.eu/api/active-data-marts/21933e46-c4e5-44cc-b49b-a6bf3636ba44/objects/11/content

但浏览器显示第2点的URL。

有人可以知道如何显示第4点的URL。

Ioan Toader

谢谢