private async Task OnApplicationMessageReceived(MqttApplicationMessageReceivedEventArgs eventArgs)
        {
            var application = ApplicationProvider.Current;

            if (application?.RequestDelegate == null)
            {
                eventArgs.ProcessingFailed = true;
                return;
            }

            using (var scope = ServiceScopeFactory.CreateScope())
            {
                var success = false;
                var context = new MqttRequestContext(scope.ServiceProvider, eventArgs.ApplicationMessage, eventArgs.ClientId);

                try
                {
                    success = await application.RequestDelegate?.Invoke(context);
                }
                catch (Exception exc)
                {
                    Logger.LogError(exc, $"Request failed to process: {exc.Message}");
                }

                eventArgs.ProcessingFailed = !success;
            }
        }
        public static IMqttApplicationBuilder MapProcessor <TProcessor, TTopicParameters>(
            this IMqttApplicationBuilder mqttApplicationBuilder,
            string topicPattern,
            Func <TTopicParameters, bool> parametersPredicate = null,
            Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null,
            MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
            bool?noLocal                      = null,
            bool?retainAsPublished            = null,
            MqttRetainHandling?retainHandling = null)
            where TProcessor : IMqttRequestProcessor <TTopicParameters>
            where TTopicParameters : class, new()
        {
            var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator);

            return(mqttApplicationBuilder.Map(
                       topicPattern,
                       async context =>
            {
                if (topicBinder.IsMatch(context.Topic))
                {
                    TTopicParameters parameters;

                    try
                    {
                        parameters = topicBinder.Bind(context.Topic);
                    }
                    catch
                    {
                        return false;
                    }

                    if (parametersPredicate?.Invoke(parameters) ?? true)
                    {
                        var parameterizedContext = new MqttRequestContext <TTopicParameters>(context, parameters);
                        var processor = context.ServiceProvider.GetRequiredService <TProcessor>();
                        return await processor.ProcessRequest(parameterizedContext);
                    }
                }

                return false;
            },
                       qualityOfServiceLevel,
                       noLocal,
                       retainAsPublished,
                       retainHandling));
        }
        public static IMqttApplicationBuilder Map <TTopicParameters>(
            this IMqttApplicationBuilder mqttApplicationBuilder,
            string topicPattern,
            MqttRequestDelegate <TTopicParameters> middleware,
            Func <TTopicParameters, bool> parametersPredicate = null,
            Action <ITopicBinderFactoryBuilder <TTopicParameters> > topicBinderFactoryBuilderConfigurator = null,
            MqttQualityOfServiceLevel?qualityOfServiceLevel = null,
            bool?noLocal                      = null,
            bool?retainAsPublished            = null,
            MqttRetainHandling?retainHandling = null)
            where TTopicParameters : class, new()
        {
            var topicBinder = CreateTopicBinder(topicPattern, topicBinderFactoryBuilderConfigurator);

            return(mqttApplicationBuilder.Map(
                       topicPattern,
                       async context =>
            {
                if (topicBinder.IsMatch(context.Topic))
                {
                    TTopicParameters parameters;

                    try
                    {
                        parameters = topicBinder.Bind(context.Topic);
                    }
                    catch
                    {
                        return false;
                    }

                    if (parametersPredicate?.Invoke(parameters) ?? true)
                    {
                        var ctx = new MqttRequestContext <TTopicParameters>(context, parameters);
                        return await middleware.Invoke(ctx);
                    }
                }

                return false;
            },
                       qualityOfServiceLevel,
                       noLocal,
                       retainAsPublished,
                       retainHandling));
        }
示例#4
0
 public MqttCommandContext(MqttRequestContext context, TEntity entity, TEntityDefinition entityDefinition)
 {
     Entity                  = entity;
     EntityDefinition        = entityDefinition;
     ContentType             = context.ContentType;
     CorrelationData         = context.CorrelationData;
     MessageExpiryInterval   = context.MessageExpiryInterval;
     Payload                 = context.Payload;
     PayloadFormatIndicator  = context.PayloadFormatIndicator;
     QualityOfServiceLevel   = context.QualityOfServiceLevel;
     ResponseTopic           = context.ResponseTopic;
     Retain                  = context.Retain;
     SubscriptionIdentifiers = context.SubscriptionIdentifiers;
     Topic          = context.Topic;
     TopicAlias     = context.TopicAlias;
     UserProperties = context.UserProperties;
     ClientId       = context.ClientId;
 }