Skip to content
This repository was archived by the owner on Jan 14, 2021. It is now read-only.
This repository was archived by the owner on Jan 14, 2021. It is now read-only.

Problem 'BotBuilder.Instrumentation.Interfaces.IBotFrameworkInstrumentation' Autofac #11

@eflorespalma

Description

@eflorespalma

I have my bot published in facebook and web and everything work fine. But the problem is when i stop to talk to the bot after 5 hours more or less and i return to talk to the bot again i have this exception The requested service 'BotBuilder.Instrumentation.Interfaces.IBotFrameworkInstrumentation' has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency. and to fix this i have to delete the conversation on facebook and talk it again and it works, another thing is that problem is just in facebook in the web chat i dont have problem maybe because i m using directline. I have this code in my IoC

This my autofac class to inject things i need

public static void Configure()
        {
            var builder = new ContainerBuilder();

            #region Modules
            builder.RegisterModule(new DialogModule());
            #endregion

            #region Dialogs
            builder.RegisterType<RootDialog>().As<LuisRootDialog<object>>().InstancePerDependency();
            #endregion

            #region Factory
            builder.RegisterType<DialogFactory>().Keyed<IDialogFactory>(FiberModule.Key_DoNotSerialize).AsImplementedInterfaces().SingleInstance();
            builder.RegisterType<TicketFactory>().Keyed<ITicketFactory>(FiberModule.Key_DoNotSerialize).AsImplementedInterfaces().SingleInstance();
            #endregion

            #region Database
            builder.RegisterGeneric(typeof(DocumentService<>)).As(typeof(IDocumentDbService<>)).SingleInstance();
            #endregion

            #region Web Api Registration
            var config = GlobalConfiguration.Configuration;
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            builder.RegisterWebApiFilterProvider(config);
            #endregion

            #region Autofac Container
            builder.Update(container: Conversation.Container);
            config.DependencyResolver = new AutofacWebApiDependencyResolver(Conversation.Container);
            #endregion
        }

And this is my message controller where i resolve my root controller

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        {
            if (activity.Type == ActivityTypes.Message)
            {
                            try
                            {
                                LogMessage("Before Open Dialogs");
                                using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
                                {
                                    await Conversation.SendAsync(activity, () => scope.Resolve<LuisRootDialog<object>>());
                                }
                            }
                            catch (Exception ex)
                            {
                                LogMessage("Error a Nivel de Abrir el Dialog");
                                LogMessage(ex.Message);
                            }
            }
            else
            {
                await HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);
            return response;
        }

This is part of my RootDialog

[Serializable]
    public class RootDialog : LuisRootDialog<object>
    {
        #region Properties
        public string Text { get; set; }
        #endregion

        #region Declarations
        readonly IDialogFactory _dialogFactory;
        #endregion

        #region Constructor
        public RootDialog(IDialogFactory dialogFactory
            ) :
            base(LuisRootConstants.MODELID, LuisConstants.SUSBSCRIPTION)
        {
            SetField.NotNull(out _dialogFactory, nameof(dialogFactory), dialogFactory);
        }
        #endregion

        #region Luis Intents
        [LuisIntent(LuisConstants.NONE)]
        public async Task None(IDialogContext context, LuisResult result)
        {
            await Util.GenerateReplying(context);

            if (result.Query.ToLower().Contains(GeneralConstants.HUMAN_ACCESS))
            {
                await context.PostAsync("Disculpe los inconvenientes, en este momento no tenemos asesores disponibles para atención.");
                context.Call(new TicketDialog(_createTicketCommand), TicketDialogResumeAfter);
            }
            else
            {
                await context.PostAsync("Disculpa los inconvenientes, pero no puedo entenderte.");
                context.Wait(MessageReceived);
            }
        }
        #endregion

        #region Methods
        protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item)
        {
            var message = await item;
            Text = message.Text.ToLowerInvariant();
            await base.MessageReceived(context, item);
        }

        #endregion
    }

And here is the instrumentations inheritance.

  [Serializable]
   public class LuisRootDialog<R> : InstrumentedLuisDialog<object>
   {
       public LuisRootDialog(string luisModelId, string luisSubscriptionKey) : base(luisModelId, luisSubscriptionKey)
       {
       }
   }

I hope somebody can help me with this because i cant find the way to make work this without deleting the conversation.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions