无法通过masstransit访问Azure服务总线队列中的接口类型的值

问题描述 投票:1回答:1

我正在使用masstransit将消息发送到azure服务总线队列,其中消息模型接口本身具有另一个接口。我的消息架构是这样的:

public interface IMyMessage
{
    Guid NormalProp1 { get; set; }

    IVariableProp VariableProp { get; set; }
}

public interface IVariableProp
{

}

这里IvariableProp是一个接口,因为我想在其中发送可变类型的数据。喜欢:

public class VarietyProp1 : IVariableProp
{
    public Guid VarietyGuid1 { get; set; }
}

public class YetAnotherVarietyProp : IVariableProp
{
    public Guid YetAnotherVarietyGuid { get; set; }
    public bool YetAnotherVarietyBool { get; set; }
}

最后我的具体信息是:

public class MyConcreteMessage : IMyMessage
{
    public Guid NormalProp1 { get; set; }

    public IVariableProp VariableProp { get; set; }
}

我已将具体消息的实例发送到Azure服务总线队列。具体消息如下:

    var variety1 = new MyConcreteMessage()
                       {
                           NormalProp1 = Guid.NewGuid(),
                           VariableProp = new VarietyProp1()
                                              {
                                                  VarietyGuid1 = Guid.NewGuid()
                                              }
                       };

此消息没有任何问题,并且已正确发送到azure服务总线。 (我与azure服务总线浏览器一起检查过。)>

当我尝试使用masstransit使用azure函数使用消息时出现问题。在我的Iconsumer

代码中,VariableProp的值为空。我的azure功能代码如下:
        using (var dependencyScope = Program.AppDependencyResolver.BeginScope())
        {

            var scopedDependencyResolver = dependencyScope.Resolve<IDependencyResolver>();
            IOperationContext operationContext = dependencyScope.Resolve<OperationContext>();
            var serviceTriggerConfiguration = dependencyScope.Resolve<IServiceBusConsumerConfig>();


            var logger = dependencyScope.Resolve<ILogger>();

            logger.Info(() => $"ConsumeEventsFromQueue function is triggered");
            string convertedMessage = Encoding.UTF8.GetString(message.Body, 0, message.Body.Length);
            var retryCount = serviceTriggerConfiguration.RetryCount;
            var interval = serviceTriggerConfiguration.IntervalInMilliSeconds;
            var receiver = Bus.Factory.CreateBrokeredMessageReceiver(
                binder,
                cfg =>
                {
                    cfg.CancellationToken = cancellationToken;
                    cfg.SetLog(traceWriter);
                    cfg.UseRetry(x => x.Interval(retryCount, interval));
                    cfg.Consumer(() => scopedDependencyResolver.Resolve<EventConsumer>());

                });
            await receiver.Handle(message);

我的消费者代码是:

public class EventConsumer:IConsumer<IMyMessage>
{
    public async Task Consume(ConsumeContext<IMyMessage> context)
    {
        var message = context.Message;
    }
}

在使用者代码中,我无法获得VariableProp

的值。当我设置调试指针时,它显示如下内容:

Here message type is GreenPipes.DynamicInternal.Events.IVariableProp

但是当我在函数中设置调试指针并将主体的字节数组转换为字符串时,我可以看到VariableProp

的值。

Value of variableProp is available here

我怀疑通过代码调用使用者时,值丢失/封装了:

cfg.Consumer(() => scopedDependencyResolver.Resolve<EventConsumer>());

我想要的是从使用者访问VariableProp

的值。我该怎么办?

我正在使用masstransit将消息发送到azure服务总线队列,其中消息模型接口本身具有另一个接口。我的消息架构如下:公共接口IMyMessage {...

.net-core azureservicebus masstransit azure-servicebus-queues
1个回答
0
投票

这不是MassTransit问题,而是序列化问题。对IMyMessage进行反序列化时,它将对IVariableProp 作为IVariableProp

© www.soinside.com 2019 - 2024. All rights reserved.