我必须在控制器中执行操作:
[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
答案 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顺序为:
但浏览器显示第2点的URL。
有人可以知道如何显示第4点的URL。
Ioan Toader
谢谢