剃刀页面重定向一段时间后

时间:2017-11-15 11:52:13

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

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

我无法做到这一点,我希望由于缺乏对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)如何将新的imagepath传递给新页面?

或者我是否完全错误地解决了这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

最后,虽然与此处的问题无关,但请注意Thread.Sleep正在阻止。您应该使用Task.Sleep代替。