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