【问题标题】:razor page redirect after some time一段时间后剃刀页面重定向
【发布时间】:2018-04-28 15:16:43
【问题描述】:

我有一个任务在后台生成和图像中运行。 当我将图像放在服务器上时,我想转到显示图像的页面。

我在这样做时遇到了麻烦,我预计是由于缺乏对 asp.net core v. 2.0 中剃须刀页面的了解

基本上我有我的页面:

<div>
    <img src="images/IAmGeneratingAnImage.png"/>
</div>

还有我的模特:

class xx:PageModel ...

    public void OnGet() {
      Task.Factory.StartNew(() => { CheckForImageAndRedirect(); });
    }

    private void CheckForImageAndRedirect() {
        string fileNameFull = "";
        do
        {
            var file = new FileInfo("C:\...\imageName.png");
            if (file.Exists )) 
                fileNameFull = file.FullName;

            Thread.Sleep(1000);
        }
        while (String.IsNullOrEmpty(fileNameFull));   

        RedirectToPage("OtherPageThatDisplaysImage"); // razorpage also.
    }

我真的很想将路径传递给新页面,这可能也可以做到......

这是我的两个问题:
a) 任务完成后如何重定向到页面?
b)如何将新的图像路径传递给新页面?

或者我附加的问题完全错误?

【问题讨论】:

  • Response.Redirect("OtherPageThatDisplaysImage"); // 现在是我的猜测...(在提出问题后)

标签: c# asp.net-core-2.0 razor-pages


【解决方案1】:

我认为您的主要问题在于Task.Factory.StartNew 的使用。一般来说,在 Web 应用程序中这样做不仅是一件坏事,而且当你这样做时,正在运行的代码会被转移到一个新线程。这就是重点,但结果是您的应用程序继续前进,当您的方法最终想要重定向时,没有什么可以重定向了:响应要么已经返回,要么太远而无法更改。更重要的是,现在在这里运行的代码甚至无法访问响应来更改它,因为它没有在同一个线程上下文中运行。

如果您想“在后台”做某事,您需要将其卸载到实际的后台进程,而不是新线程。您可以使用 HangFire 或类似工具来完成此操作。然后继续向用户返回响应,并使用 SignalR 或通过 AJAX 进行长轮询来检查后台作业的状态。一旦您的工作完成,您就可以适当地重定向用户,但这需要发生在客户端,而不是服务器端。一旦服务器返回响应,它就完成了。如果不先从客户端接收到新请求,它就无法发出重定向。

最后,虽然与这里的问题无关,但请注意Thread.Sleep 正在阻塞。你应该改用Task.Sleep

【讨论】:

  • 谢谢.. 嗯,客户端检查可以简单地通过在 javascript 中轮询来完成..(感谢您的睡眠)
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2020-05-22
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多