【问题标题】:Check overall progress of Azure Job and send it to an ASP.NET View检查 Azure 作业的整体进度并将其发送到 ASP.NET 视图
【发布时间】:2019-10-31 22:00:22
【问题描述】:

我正在使用托管在 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(); 发送到我的视图中?

【问题讨论】:

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


    【解决方案1】:

    displayProgress 方法在另一个线程中运行,因此它不与 EncodeMyVideo 方法共享相同的上下文。因此,您需要使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2014-04-07
      • 2023-04-03
      • 2012-09-27
      相关资源
      最近更新 更多