Ядро ASP.Net перенаправляет на действие, которое возвращает FileStreamResult - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно выполнить действия в контроллере:

[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.Это способ изменить также URL.Если действие GetStream возвращает json, URL-адрес изменяется на https://localhost:44352/api/values/stream.Как можно также изменить URL-адрес в случае, если я возвращаю FileStreamResult.

Возможно иметь что-то в представлении, как "ожидание ..." и вернуть FileStreamResult

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Спасибо, может быть, мне нужно больше описать мою проблему.У меня есть действие, которое возвращает FileFileStreamResult и авторизуется с помощью OpenIdConnect и IdentityServer4 Authority.Это действие вызывается из углового веб-приложения в новой вкладке.Если браузер знает, что 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

но браузер отображает URL-адрес из пункта 2.

Может кто-нибудьзнать, как сделать так, чтобы отображался URL с пункта 4.

Ioan Toader

Спасибо

0 голосов
/ 25 сентября 2019

Как также можно изменить URL в случае, если я верну FileStreamResult?

Вы можете вернуть HTML, чтобы сделать это:

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

Ключ заключается в написании магии из 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 View и поместите содержимое в файл View.

...