创建 Azure 函数“未找到作业函数”错误的问题

Posted

技术标签:

【中文标题】创建 Azure 函数“未找到作业函数”错误的问题【英文标题】:Issue with creating an Azure Function "No job functions found" error 【发布时间】:2020-05-29 22:26:32 【问题描述】:

我想要实现的是,我希望能够创建一个 Azure 函数,该函数将使用 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.\n0", 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。相反,我收到一个错误:

未找到工作职能。尝试公开您的工作类别和方法。如果您正在使用绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如 builder.AddAzureStorage()、builder.AddServiceBus( )、builder.AddTimers() 等)。

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

【问题讨论】:

你能edit你的问题并提供你试图运行的代码吗? @MindSwipe 我已经更新了。 为什么你的UploadVideo类是internal?不应该是public吗? @GauravMantri 是的,我也试过两个 public,但错误是一样的。 @ZsoltBendes,你能给我一些关于如何将其转换为 Azure 函数的教程吗? 【参考方案1】:

您错过了FunctionName 属性

[FunctionName("Function1")]
        public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
                ILogger log)
        
            log.LogInformation("C# HTTP trigger function processed a request.");
             //UploadVideoToYoutube() method call here;
            return new OkResult();
        

Getting started docs

【讨论】:

我应该将这部分代码放在我的代码中的什么位置?将此属性添加到代码中时出现错误。谢谢。 @Peter,您应该清理所有内容并从文档重新开始 在带有 .NET 5 的 Azure Functions 中,您需要使用 Function 属性而不是 FunctionName,否则这将不起作用。 @Thom Function 属性在哪个包中?我根本找不到它,它在默认代码中。 @NapoleonIkeJones 在Microsoft.Azure.Functions.Worker nuget 包中。这是为 .NET 5 添加进程外执行模型的包。【参考方案2】:

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

您可以在使用 Visual Studio 时尝试按照以下说明操作吗: https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-your-first-function-visual-studio

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

这样你最终会得到一个正确的函数应用结构,包括正确的依赖关系。

【讨论】:

嗨@Marc 感谢您提供的信息。除了我选择了错误的寺庙之外,您现在发现代码中还缺少什么吗?谢谢。 我看到一些对文件路径的引用,这在开发无服务器功能时是一种不好的做法。您可以查看用于 blob 存储的 Azure Functions 绑定,以便在您的函数中使用文件:docs.microsoft.com/en-us/azure/azure-functions/…。并删除对 Console.Writeline 的调用。【参考方案3】:

在尝试了一些不起作用的事情后,退出并重新启动 Visual Studio 为我修复了它。我不知道为什么这能解决这么多问题。

【讨论】:

以上是关于创建 Azure 函数“未找到作业函数”错误的问题的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数中的 Az.Functions 模块引发错误

Azure 函数创建太多与 PostgreSQL 的连接

Azure 函数不会创建 blob 元数据

Azure 函数错误 - “密钥功能不可用,因为为此函数应用启用了身份验证/授权。”

Azure Functions 突然找不到入口点错误

在不同的 Azure 服务总线队列中使用相同的消息 ID 会导致错误