我有一个正在工作的.NET6进程内Azure函数。我正在将它转换为一个隔离的工作进程(进程外).net7函数。
我有一个HttpTrigger函数,它应该从blob存储中获取一个文件,因为blob存储是区分大小写的,并且所有文件都是以大写形式保存的,所以我需要将输入也设为大写。
使用in-proc函数时,我通过注入Microsoft.Azure.WebJobs.IBinder binder
然后使用binder.BindAsync<byte[]>(new Microsoft.Azure.WebJobs.BlobAttribute($"%BlobContainerName%/{fooUpper}", FileAccess.Read)
来完成此操作
这是.net6进程内函数:
[Function(nameof(GetFile))]
public async Task<IActionResult> GetFile(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "bar/{foo}")] HttpRequest req,
Microsoft.Azure.WebJobs.IBinder binder, Microsoft.Azure.WebJobs.ExecutionContext context, string foo)
{
// The file name is always upper-case:
var fooUpper = foo.ToUpperInvariant();
var blobStream = await binder.BindAsync<byte[]>(
new Microsoft.Azure.WebJobs.BlobAttribute($"%BlobContainerName%/{fooUpper}", FileAccess.Read),
req.FunctionContext.CancellationToken).ConfigureAwait(false);
return await ExecuteAsync(fooUpper, context.FunctionDirectory, blobStream,
req.FunctionContext.CancellationToken)
.ConfigureAwait(false);
}
当然,我尝试过将HttpRequest req
替换为HttpRequestData req
,将此函数迁移到一个.net7隔离函数,它可以编译,但当我运行它时,binder
始终是null
。
函数的隔离函数版本是什么?
- 是否需要创建自定义属性?
- 或者创建一些中间件,使URL大写?
- 或者我应该创建一个服务,在启动时注册并在函数类中使用DI?
请指教。
1条答案
按热度按时间cl25kdpy1#
检查我的以下发现是否有助于解决您的问题:
BlobContainerClient不再以隔离模式工作
AFAIK,
BlobContainerClient
应使用Azure.Storage.Blobs
NuGet包在Azure Functions中与.NET独立进程版本7配合使用,如用户@HariKrishna 和MS DOC的SO答案#75015570所示。如果您使用NuGet包
Azure.Storage.Blobs
,则可以初始化在.NET独立进程中兼容的BlobContainerClient
类对象,并且为了使用Blob容器对象,必须初始化BlobServiceClient以连接到存储帐户并访问Blob容器。这是一篇关于Azure Functions .NET隔离进程的GitHub文章,介绍了如何使用Ibinder输入参数进行数据绑定,同一篇文章中还提供了一些在Ibinder和StorageAccountAttribute上下文中工作的示例,例如
Microsoft.Azure.WebJobs.BlobAttribute
。