检查Azure Job的总体进度并将其发送到ASP.NET视图

时间:2019-06-18 09:34:53

标签: asp.net-mvc azure signalr jobs signalr-hub

我正在使用Azure上托管的ASP.NET MVC5创建一个网站。
我的用户可能上传了一个视频,我想创建一个进度条或一些指示完成上传/转码的百分比的东西。

我正在关注Microsoft tutorial,并且视频已正确上传。
但是,一旦将工作分配给Azure,它们就会显示以下代码行:

job = job.StartExecutionProgressTask(
  j =>
  {
      Console.WriteLine("Job state: {0}", j.State);
      Console.WriteLine("Job progress: {0:0.##}%", j.GetOverallProgress());
  },
  CancellationToken.None).Result;

我正在尝试对其进行修改,以使其显示在我的网页上。

问题

但是,我无法“发送” j.GetOverallProgress()到我的视图。
谁能解释如何做到这一点?


我到目前为止所做的

安装Microsoft.AspNet.SignalR软件包(v 2.4.1)
(首次使用SignalR)

在我的视图中添加以下行:

<script src="~/Scripts/signalR/jquery.signalR-2.4.1.js"></script>
<script src="~/signalr/hubs"></script>

<script type="text/javascript">
    $(document).ready(function () {
        var hub = $.connection.videoService;

        $("#btnCreate").on("click", function () {
            hub.client.displayProgress = function (data) {
                console.log(data); //Nothing is logged
            };
        })
    });
</script>

这些行在我的后端:(\ Services文件夹中的VideoService.cs)

public class VideoService : Hub
{
    public EncodeMyVideo(...)
    {
        /* [...] */

        job = job.StartExecutionProgressTask(j => { 
            displayProgress(job); 
        }, CancellationToken.None).Result;
    }

    public double displayProgress(IJob job)
    {
        return job.GetOverallProgress();
    }
}

在调试模式下,它转到displayProgress方法,但从不向视图发送任何内容。

作为一个提示,我也尝试了这个方法:

public void displayProgress(IJob job)
{
    Clients.Caller.displayProgress(job.GetOverallProgress());
}

但是我得到这个错误:

  

不支持使用不是由HubPipeline创建的Hub实例。

我对SignalR还是很陌生,尽管有this SO answer,我还是不太明白问题是什么。

我该怎么做才能将job.GetOverallProgress();发送到视图中?

1 个答案:

答案 0 :(得分:0)

displayProgress方法在另一个线程中运行,因此它不会与EncodeMyVideo方法共享相同的Context。因此,您需要使用GlobalHost.ConnectionManager.GetHubContext <>来获取集线器上下文和客户端连接。

string callerId = Context.ConnectionId;
job = job.StartExecutionProgressTask(j => { 
            displayProgress(job, callerId); 
        }, CancellationToken.None).Result;

public void displayProgress(IJob job, string clientId)
{
  //Access to your hub context outside the request context
   GlobalHost.ConnectionManager.GetHubContext<VideoService>().Clients.Client(clientId).displayProgress(job.GetOverallProgress());
}  

对于报告进度,您也可以选中此Reporting progress from hub method invocations