在本地运行简单的计时器触发器 Azure 函数时,出现以下错误。
我使用 Visual Studio 2019 创建带有计时器触发器的新 Azure Functions 项目。
代码:
using System;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
namespace FunctionApp1
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([TimerTrigger("*/12 * * * * *")]TimerInfo myTimer, ILogger log)
{
log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
[2021-11-24T15:45:29.878Z] The listener for function 'Function1' was unable to start.
[2021-11-24T15:45:29.880Z] The listener for function 'Function1' was unable to start. Azure.Storage.Blobs: Server encountered an …Run Code Online (Sandbox Code Playgroud) 我找不到任何有关如何强制 Azure Function v4 成为单例的文档,因此当函数应用程序横向扩展(出于某种原因)时,其中一个函数不会横向扩展。
我的函数是一个定时器触发器,位于 v4 .NET6.0 隔离的 Azure 函数中。
我正在尝试设置 Visual Studio Code,以便可以修改 Azure Functions,但似乎遇到了一些问题。我使用的指南是 MS 官方文档,可以在此处找到。
当我第一次运行代码时,出现以下错误:
U1100:无法解析“net6.0”的“Microsoft.NET.Sdk.Functions (>= 4.0.1)”
我看过一些类似的帖子,其中用户遇到了这个问题,但它是在旧版本上,并且没有找到适合我的设置的明显答案。如果整个安装是新的,那么从这个角度来看应该不会有任何问题。
任何帮助将不胜感激。
下面是我的 csproj 文件。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<RootNamespace>Azure_Functions</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="host.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="local.settings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
</ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud) 我有一条服务总线消息,其中ApplicationProperties添加了一些内容:
ServiceBusMessage serviceBusMessage
serviceBusMessage.ApplicationProperties.Add("TenantId", tenantId);
serviceBusMessage.ApplicationProperties.Add("Serialization", "JSON");
Run Code Online (Sandbox Code Playgroud)
我需要从我的 Azure 函数访问这些。在类库风格的函数应用程序中,我可以使用,但ServiceBusReceivedMessage在进程外似乎没有等效的东西?
我在 Azure 函数的运行状况检查中不断收到错误 503,它显示错误 503。函数主机未运行。这是非常不一致的,每隔几天才会发生一次,我正在使用消费计划,但正在考虑高级计划是否可以解决这个问题。
我正在开发一个带有 ServiceBusTrigger 队列的 Azure Function(进程内模型,V 4.1)。该函数工作正常并被触发。该函数如下所示:
public async Task Run([ServiceBusTrigger("my-queue", Connection = "myConnectionString", AutoCompleteMessages = true)]
string myQueueItem, Int32 deliveryCount, DateTime enqueuedTimeUtc, string messageId)
Run Code Online (Sandbox Code Playgroud)
我现在希望能够获取我在消息中传递的correlationId,并且我希望能够自己“Complete()”消息。
我在这里查看了文档(https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus-trigger?tabs=in-process%2Cextensionv5&pivots=programming-language-csharp)但没有找到任何方法来绑定其他参数,如 Message、MessageReceiver 等。每当我尝试使用这些参数时,函数运行时都会出现绑定异常。
这些是我正在使用的相关包
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.7.0" />
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Core" Version="1.4.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.3.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.0" />
Run Code Online (Sandbox Code Playgroud)
我一定错过了一些东西......任何提示都会受到赞赏!
编辑:清理后,这些是相关的包:
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" />
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.3.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="6.0.3" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.0" />
Run Code Online (Sandbox Code Playgroud) 我正在尝试侦听可以包含具有多种事件类型的消息的服务总线。当消息到达时,我想根据事件类型对其进行处理。我有 2 个 azure 函数来处理不同的事件类型消息,但是当一个函数接收到消息时,另一个函数不会被触发。是否可以同时触发它们并让它们决定由哪一个处理消息?
这是一些示例代码,它们位于两个独立的项目中:
[FunctionName("Function1")]
public async Task RunAsync(
[ServiceBusTrigger("queueName", Connection = "connectionName")]
Message message,
MessageReceiver messageReceiver,
ILogger log)
{
var body = Encoding.Default.GetString(message.Body);
var messageType = _helper.GetMessageType(body);
if (messageType is not MessageType.Type1)
return;
// business logic
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
[FunctionName("Function2")]
public async Task RunAsync(
[ServiceBusTrigger("queueName", Connection = "connectionName")]
Message message,
MessageReceiver messageReceiver,
ILogger log)
{
var body = Encoding.Default.GetString(message.Body);
var messageType = _helper.GetMessageType(body);
if (messageType is not MessageType.Type2)
return;
// business logic
await messageReceiver.CompleteAsync(message.SystemProperties.LockToken);
}
Run Code Online (Sandbox Code Playgroud) 我们有一个服务总线队列;我们正在考虑通过Azure函数中的服务总线队列触发器来处理消息。但我们希望(在循环中)使用批量消息,而不是为每条消息重新触发 Function App。应该采取什么方法来实现这一点以及使用哪个处理程序。如果仅使用 Azure Function,或者我们可以托管一个应用服务来使用它。
我一直在使用 ARM 模板来部署 Azure Function,并使用 V1 身份验证进行 Azure Ad b2c 身份验证。
"resources": [{
"name": "[concat(parameters('appName'), '/authsettings')]",
"apiVersion": "2016-08-01",
"type": "Microsoft.Web/sites/config",
"location": "[resourceGroup().location]",
"dependsOn": [
"[resourceId('Microsoft.Web/sites', parameters('appName'))]"
],
"properties": {
"enabled": true,
"unauthenticatedClientAction": "RedirectToLoginPage",
"tokenStoreEnabled": true,
"clientSecret":"[parameters('b2cClientSecret')]",
"clientId": "[parameters('b2cClientId')]",
"issuer": "[parameters('b2cMetadataDocumentUrl')]"
}
}]
Run Code Online (Sandbox Code Playgroud)
一切都工作正常,直到我开始收到从Azure 门户中的经典身份验证体验升级的消息。
收到此消息后,部署失败并显示以下消息
##[error]At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.
##[error]Details:
##[error]undefined: Cannot execute the request for site app-fun-my-af because the site is running on …Run Code Online (Sandbox Code Playgroud) azure azure-resource-manager azure-ad-b2c azure-rm-template azure-functions
现在,我们使用 Azure 服务总线来触发我们的函数应用程序。传入消息的速率非常高,但我们希望一次仅触发函数应用程序一条消息(按照我们自己的节奏进行处理,而不是处理太多请求错误)。如何配置服务总线一次只向接收者发送一条消息?这是我们的基本功能应用程序代码:
[FunctionName("ServiceBusListener")]
public void Run([ServiceBusTrigger("myqueue", Connection = "MyConnection")]string queueContent, ILogger log)
{
_myService.ProcessMessage(queueContent);
log.LogInformation($"C# ServiceBus queue trigger function processed message: {queueContent}");
}
Run Code Online (Sandbox Code Playgroud)