Asp.net mvc 如何通知YouTube视频上载的进度

Asp.net mvc 如何通知YouTube视频上载的进度,asp.net-mvc,angularjs,youtube-api,progress-bar,Asp.net Mvc,Angularjs,Youtube Api,Progress Bar,我正在使用Angularjs开发一个用于客户端编程的ASP.NET Web API。我的应用程序用户将在我的应用程序中上载/观看视频。我想将这些视频上传到YouTube(使用服务器端的YouTube API) 目前,我已经完成了上传部分,但我不知道如何在客户端浏览器上显示一个进程栏,真正显示上传视频的进度。我可以在服务器端捕获进度,因为我正在使用以下代码进行上载: VideosResource.InsertMediaUpload insertRequest = youtube.Videos.In

我正在使用Angularjs开发一个用于客户端编程的ASP.NET Web API。我的应用程序用户将在我的应用程序中上载/观看视频。我想将这些视频上传到YouTube(使用服务器端的YouTube API)

目前,我已经完成了上传部分,但我不知道如何在客户端浏览器上显示一个进程栏,真正显示上传视频的进度。我可以在服务器端捕获进度,因为我正在使用以下代码进行上载:

VideosResource.InsertMediaUpload insertRequest = youtube.Videos.Insert(video, "snippet, status", fileStream, "video/*");
insertRequest.ProgressChanged += insertRequest_ProgressChanged;
insertRequest.ResponseReceived += insertRequest_ResponseReceived;

insertRequest.Upload();

在这里,我可以捕获
ProgressChanged
事件以查看进度,但如何通知最终用户(浏览器)这些进度更新?

您有很多方法,这里有两种方法:

  • 在循环中从客户端向服务器发出AJAX请求,并取得进展。在这种情况下,您需要将
    insertRequest\u ProgressChanged
    中的进度保存到静态存储(静态上载字典)中

  • 使用。这将允许您直接进行更新

无论如何,您需要将上载进度存储在任何存储中

例如,您可以创建静态类,例如:

public static class UploadingDispatcher
{
    private static Dictionary<Guid, Int32> Uploads = new Dictionary<Guid, Int32>();
    private static object syncRoot = new object();

    public static void Add(Guid id)
    {
        lock (syncRoot)
        {
            Uploads.Add(id,0);
        }
    }

    public static void Remove(Guid id)
    {
        lock (syncRoot)
        {
            Uploads.Remove(id);
        }
    }

    public static int GetProgress(Guid id)
    {
        lock (syncRoot)
        {
            if (Uploads.ContainsKey(id))
            {
                return Uploads[id];
            }
            return 100;
        }
    }

    public static Boolean SetProgress(Guid id, Int32 value)
    {
        lock (syncRoot)
        {
            if (Uploads.ContainsKey(id))
            {
                Uploads[id] = value;
                return true;
            }
            return false;
        }
    }
}
insertRequest\u ProgressChanged
方法中,使用UploadingDispatcher更新进度:

UploadingDispatcher.SetProgress(id);
您需要创建单独的操作来获得进度,如
GetUploadingProgress
。在此操作方法中,您可以通过调用以下命令获得进度:

UploadingDispatcher.GetProgress(id);
要在上载文件后从UploadingDispatcher中删除上载,请使用:

UploadingDispatcher.Remove(id);

强大的任务!查看此文件以供参考。我已经掌握了c#代码的进展,这是我的服务器端代码。我需要的是将此进度通知客户端(浏览器中的HTML)。谢谢。哪一个是更好的选择?另外,当我使用Web API作为后端时,我应该在哪里保存进度,这样就没有用户会话了?很抱歉,我忘了提到有问题的Web API,因此也更新了问题:)看起来很酷。我不该为了这个目的考虑ASP.NET SignalR吗?这两种方法的优缺点是什么?Signal将允许您发出单个连续请求,而不是get请求的if循环。如果你想在一个地方使用信号器,我更喜欢用老方法——请求循环,这更容易实现。我看到你说过“在循环中从客户端向服务器发出AJAX请求”,请你提供上传和显示AJAX文件进度的示例代码。我只是不明白为什么要使用循环来进行文件上传。
UploadingDispatcher.Remove(id);