c# - 创建 Azure 函数时出现问题 "No job functions found"错误

标签 c# azure-functions youtube-data-api google-api-dotnet-client

我想要实现的是,我希望能够创建一个 Azure Functions,使用 YouTube API 将视频上传到 YouTube。示例:https://developers.google.com/youtube/v3/docs/videos/insert .创建 azure 函数后,我想在我的 Azure 逻辑应用程序中使用该函数。这是 Azure 函数的代码(上传的视频):

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Upload;
using Google.Apis.Util.Store;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;


namespace Google.Apis.YouTube.Samples
    {
        /// <summary>
        /// YouTube Data API v3 sample: upload a video.
        /// Relies on the Google APIs Client Library for .NET, v1.7.0 or higher.
        /// See https://developers.google.com/api-client-library/dotnet/get_started
        /// </summary>
        public class UploadVideo
        {
            [STAThread]
            static void Main(string[] args)
            {
                Console.WriteLine("YouTube Data API: Upload Video");
                Console.WriteLine("==============================");

                try
                {
                    new UploadVideo().Run().Wait();
                }
                catch (AggregateException ex)
                {
                    foreach (var e in ex.InnerExceptions)
                    {
                        Console.WriteLine("Error: " + e.Message);
                    }
                }

                Console.WriteLine("Press any key to continue...");
                Console.ReadKey();
            }

            private async Task Run()
            {
                UserCredential credential;
                using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
                {
                    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                        GoogleClientSecrets.Load(stream).Secrets,
                        // This OAuth 2.0 access scope allows an application to upload files to the
                        // authenticated user's YouTube channel, but doesn't allow other types of access.
                        new[] { YouTubeService.Scope.YoutubeUpload },
                        "user",
                        CancellationToken.None
                    );
                }

                var youtubeService = new YouTubeService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name
                });

                var video = new Video();
                video.Snippet = new VideoSnippet();
                video.Snippet.Title = "Default Video Title";
                video.Snippet.Description = "Default Video Description";
                video.Snippet.Tags = new string[] { "tag1", "tag2" };
                video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
                video.Status = new VideoStatus();
                video.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
                var filePath = @"/Users/sean/Desktop/audio/test1.mp4"; // Replace with path to actual movie file.

                using (var fileStream = new FileStream(filePath, FileMode.Open))
                {
                    var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*");
                    videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
                    videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;

                    await videosInsertRequest.UploadAsync();
                }
            }

            void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress)
            {
                switch (progress.Status)
                {
                    case UploadStatus.Uploading:
                        Console.WriteLine("{0} bytes sent.", progress.BytesSent);
                        break;

                    case UploadStatus.Failed:
                        Console.WriteLine("An error prevented the upload from completing.\n{0}", progress.Exception);
                        break;
                }
            }

            void videosInsertRequest_ResponseReceived(Video video)
            {
                Console.WriteLine("Video id '{0}' was successfully uploaded.", video.Id);
            }
        }
    }

当我运行这段代码时,我没有看到这样的预期结果:https://developers.google.com/youtube/v3/docs/videos#resource .相反,我收到一个错误:

No job functions found. Try making your job classes and methods public. If you're using binding extensions (e.g. Azure Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), builder.AddTimers(), etc.).

我已经公开了我所有的方法。我不确定我错过了什么。

最佳答案

您尝试创建 Azure 函数时似乎使用了错误的模板,因此它创建了一个控制台应用程序。现在您缺少 Azure Functions 特定的 Nuget 包,我认为您的项目还缺少一些 Azure Functions 特定的文件,例如 host.json。

您能否在使用 Visual Studio 时尝试按照这些说明操作: https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-your-first-function-visual-studio

或使用 VS Code 时的这些说明: https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-function-vs-code?pivots=programming-language-csharp

通过这种方式,您最终会得到一个正确的 Function App 结构,包括正确的依赖项。

关于c# - 创建 Azure 函数时出现问题 "No job functions found"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60220938/

相关文章:

c# - 缩放后重新计算面板 AutoScrollPosition

c# - ASP.NET Core - 下载 .exe 返回 404 错误

azure - 如何在未托管在 Azure 上的 Web 应用程序中调用 Azure 函数

java - 谷歌 OAUTH : The redirect URI in the request did not match a registered redirect URI

android - Youtube api 400 错误请求

java - 我无法计算我的订阅者的Youtube API V3

c# - 图像查看器的用户控件与自定义控件

c# - 通用局部 View : how to set a generic class as model?

接口(interface)底层对象的C#流利验证

表存储上的 Azure 函数 CRUD