我有一个.net核心控制台应用程序,我打算将其部署为Azure Web作业。作业的目的是在Azure Service Bus队列中侦听新消息。我已经使用包含[ServiceBusTrigger]属性的函数设置了侦听器。我构建了一个虚拟的实现,该实现只从队列中读取最新消息-可以正常工作,而不会出现问题-消息已从服务总线队列正确传递给我的函数。
当我尝试进入下一个级别并将接口参数添加到要由DI注入的函数中时,出现错误。
Microsoft.Azure.WebJobs.Host.Indexers.FunctionIndexingException:错误索引方法'Functions.ProcessMeasurementData'InvalidOperationException:无法将参数“ service”绑定到类型IProcessMeasurementService。确保支持参数类型通过绑定。如果您使用的是绑定扩展(例如,Azure存储,ServiceBus,计时器等),请确保已将您的启动代码中扩展名的注册方法(例如builder.AddAzureStorage(),builder.AddServiceBus(),builder.AddTimers()等。)>
这是我的职责。如果我删除参数IProcessMeasurementService服务,它将无法从Visual Studio 2019在本地运行(我尚未尝试将其作为WebJob部署到Azure),在将新项目添加到Azure Service Bus队列中时将它们拾取。
public class Functions { public static async Task ProcessMeasurementData( [ServiceBusTrigger("process-measurement-data-queue", Connection = "AzureWebJobsServiceBus")] Message message, IProcessMeasurementService service) { try { var measurements = JsonConvert .DeserializeObject<List<CreateMeasurementInput>> (Encoding.UTF8.GetString(message.Body)); await service.DoStuff(measurements); // log.LogInformation(message.ContentType); } catch (Exception e) { throw; } }
我认为我正在正确注册服务,如下所示:
{ // Register application services services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>(); });
这是我的主要功能。
static void Main(string[] args) { var builder = new HostBuilder(); builder.ConfigureAppConfiguration((builder) => { builder .AddJsonFile("appsettings.json", false, true) .AddEnvironmentVariables(); }); builder.ConfigureWebJobs(b => { b.AddServiceBus(x => { x.MessageHandlerOptions = new MessageHandlerOptions(ExceptionReceivedHandler) { AutoComplete = false }; }); b.AddAzureStorageCoreServices(); }); builder.ConfigureServices(services => { services.AddOptions(); // Register application services services.AddSingleton<IProcessMeasurementService, ProcessMeasurementService>(); }); var host = builder.Build(); using (host) { host.Run(); } }
从谷歌搜索看来,问题可能出在我的nuget软件包版本上。我尝试添加一个名为“ host.json”的文件,以防天蓝色函数版本与扩展库冲突的已知问题。但是它什么也没做。我实际上并没有使用AzureFunctions(我指的是无服务器功能),但是在此阶段我正在抓紧稻草。
有人知道这是什么问题吗?
这是host.json,以防万一这是问题。
{ "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[1.*, 2.0.0)" } }
这里是我安装的nuget版本
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="4.1.2" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.16" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="4.1.1" />
<PackageReference Include="Microsoft.Azure.WebJobs.Sources" Version="3.0.16" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />
我有一个.net核心控制台应用程序,我打算将其部署为Azure Web作业。作业的目的是在Azure Service Bus队列中侦听新消息。我已经使用...
从静态函数方法更改为实例成员,并通过构造函数注入将服务直接注入到函数类中。