Проверьте общий прогресс задания Azure и отправьте его в представление ASP.NET. - PullRequest
0 голосов
/ 18 июня 2019

Я создаю веб-сайт с ASP.NET MVC5, размещенный на Azure.
Мои пользователи могут загружать видео, и я хотел бы создать индикатор выполнения или что-то, показывающее, сколько% загружать / транскодироватьбыло сделано.

Я следую этому учебному пособию Microsoft и видео правильно загружены.
Однако они показывают эти строки кода, как только задание добавлено в 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)

Добавьте эти строки в мойview:

<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>

И эти строки на моем бэкэнде: (VideoService.cs в папке \ Services)

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, не поддерживается.

Я очень новичок в SignalR, и, несмотря на этот ответ SO , я не совсем понимаю, в чем проблема.

Что я должен сделать, чтобы отправить job.GetOverallProgress(); на мой взгляд?

1 Ответ

0 голосов
/ 17 июля 2019

Метод 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());
}  

Для сообщения о прогрессе вы также можете проверить это Отчет о прогрессе из вызовов методов хаба

...