我想看看是否/如何插入用ServiceBusTrigger修饰的参数的反序列化过程?
说我有一个看起来像的函数:
public static void HandleMessage([ServiceBusTrigger("myqueue")] MyCustomType myCustomType) { }
我将如何接管反序列化?我知道有一个IArgumentBindingProvider和IArgumentBinding的概念,但它看起来不像ServiceBusTrigger支持这些概念。
我知道我可以使用GetBody< Stream>()并反序列化,但我想知道我是否可以插入ServiceBusTrigger的管道。通过查看SDK,ServiceBusTrigger有一个IQueueArgumentBindingProviders的硬编码列表,因此我无法添加自己的。
答案 0 :(得分:0)
如果您查看Azure WebJobs SDK Extensions,可以查看如何创建自己的绑定:
否则ServiceBusConfiguration
会公开一个允许您拦截ServiceBusTrigger管道的MessagingProvider
属性:
private static void Main()
{
var sbConfig = new ServiceBusConfiguration()
{
MessagingProvider = // you implemetation of the MessagingProvider class goes here !!!
};
var config = new JobHostConfiguration();
config.UseServiceBus(sbConfig);
new JobHost(config).RunAndBlock();
}
以下是MessagingProvider
实施的简单框架:
public sealed class MyMessagingProvider : MessagingProvider
{
private readonly ServiceBusConfiguration _config;
public MyMessagingProvider(ServiceBusConfiguration config)
: base(config)
{
_config = config;
}
public override MessageProcessor CreateMessageProcessor(string entityPath)
{
return new MyMessageProcessor(_config.MessageOptions);
}
private class MyMessageProcessor : MessageProcessor
{
public MyMessageProcessor(OnMessageOptions messageOptions)
: base(messageOptions)
{
}
public override Task<bool> BeginProcessingMessageAsync(BrokeredMessage message, CancellationToken cancellationToken)
{
// Intercept the message before the execution of the triggerred function
return base.BeginProcessingMessageAsync(message, cancellationToken);
}
public override Task CompleteProcessingMessageAsync(BrokeredMessage message, FunctionResult result, CancellationToken cancellationToken)
{
// Intercept the message after the execution of the triggerred function and before being completed
return base.CompleteProcessingMessageAsync(message, result, cancellationToken);
}
}
}
所以你现在的主要功能是:
private static void Main()
{
var sbConfig = new ServiceBusConfiguration();
sbConfig.MessagingProvider = new MyMessagingProvider(sbConfig);
var config = new JobHostConfiguration();
config.UseServiceBus(sbConfig);
new JobHost(config).RunAndBlock();
}