0

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

[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

4

2 回答 2

0

如果我返回 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视图并将内容放在视图文件中。

于 2019-09-25T08:58:16.080 回答
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。

伊万蟾蜍

谢谢

于 2019-09-25T12:19:19.827 回答