【问题标题】:ASP.Net core redirect to an action which return FileStreamResultASP.Net 核心重定向到返回 FileStreamResult 的操作
【发布时间】:2019-09-25 06:48:34
【问题描述】:

我必须在控制器中执行操作:

[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

【问题讨论】:

    标签: c# asp.net-core asp.net-web-api routing filestreamresult


    【解决方案1】:

    如果我返回 FileStreamResult,如何更改 url?

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

    公共 IActionResult Redirect1() { var r = RedirectToAction(nameof(GetStream)); 返回 r; 罢工> var url = this.Url.Action(nameof(GetStream)); 返回内容( $"", “文本/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 视图并将内容放入视图文件中。

    【讨论】:

    • 我添加了更多描述,例如另一个答案。你能再读一遍吗?如果你有答案。
    • @ToaderIoan "如何从第 4 点开始显示 URL。":如上所述,使用 javascript history.pushState({},'downloading','{url}'); 更改 URL。
    • 第 4 点的 URL。返回 FileStreamResult 不是后面的视图。
    • @ToaderIoan 无论返回什么结果,javascript 都应该可以工作。请试一试。
    • @itmius,来自 2 和 3 的操作不是我来自 IdentityServer4
    【解决方案2】:

    谢谢, 也许我必须更多地描述我的问题。 我有一个返回 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。

    伊恩·托德

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-21
      • 2019-02-17
      • 2011-09-15
      • 2019-10-24
      • 2021-11-18
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      相关资源
      最近更新 更多