saravana14
saravana14

Reputation: 35

Microsoft bot framework webchat C#

I am developing a chatbot using the Microsoft bot framework in C#. We have a functionality where it queries the database and returns the result, but it might take up to 25-30 secs for the result to return.

By that time bot says "cannot send,please retry". Is there a way to increase this timeout? Or can we have something like "please wait" message for the user so that user will know that the request is processing?

Upvotes: 1

Views: 629

Answers (2)

Grace Feng
Grace Feng

Reputation: 16652

It's hard coded in SDK, we're not able to override the message like "Couldn't send, retry". As Nicolas said, a workaround is to send a proactive message to user.

For example you can firstly create a ConversationStarter.cs class like this:

public class ConversationStarter
{
    //Note: Of course you don't want these here. Eventually you will need to save these in some table
    //Having them here as static variables means we can only remember one user :)
    public static string fromId;
    public static string fromName;
    public static string toId;
    public static string toName;
    public static string serviceUrl;
    public static string channelId;
    public static string conversationId;

    //This will send an adhoc message to the user
    public static async Task Resume(string conversationId, string channelId)
    {
        var userAccount = new ChannelAccount(toId, toName);
        var botAccount = new ChannelAccount(fromId, fromName);
        var connector = new ConnectorClient(new Uri(serviceUrl));

        IMessageActivity message = Activity.CreateMessageActivity();
        if (!string.IsNullOrEmpty(conversationId) && !string.IsNullOrEmpty(channelId))
        {
            message.ChannelId = channelId;
        }
        else
        {
            conversationId = (await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount)).Id;
        }
        message.From = botAccount;
        message.Recipient = userAccount;
        message.Conversation = new ConversationAccount(id: conversationId);
        message.Text = "Hello, work is done!";
        message.Locale = "en-Us";
        await connector.Conversations.SendToConversationAsync((Activity)message);
    }
}

Then in your dialog, you can code like this:

public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    var message = await result;

    //We need to keep this data so we know who to send the message to. Assume this would be stored somewhere, e.g. an Azure Table
    ConversationStarter.toId = message.From.Id;
    ConversationStarter.toName = message.From.Name;
    ConversationStarter.fromId = message.Recipient.Id;
    ConversationStarter.fromName = message.Recipient.Name;
    ConversationStarter.serviceUrl = message.ServiceUrl;
    ConversationStarter.channelId = message.ChannelId;
    ConversationStarter.conversationId = message.Conversation.Id;

    await context.PostAsync("Please wait, we're processing...");

    Processing();
}


public async Task Processing()
{
    //replace the task.delay() method with your task.
    await Task.Delay(30000).ContinueWith((t) =>
    {
        ConversationStarter.Resume(ConversationStarter.conversationId, ConversationStarter.channelId);
    });

}

Then Task.Delay(30000) method is used for a 30s task testing, you should be able to replace it with your task for retrieving data from your database.

Upvotes: 1

Nicolas R
Nicolas R

Reputation: 14619

You should do the following:

  1. acknowledge the request of the user with a basic text reply
  2. save the message information and process the request
  3. make a proactive message once you got the reply of your system

Upvotes: 0

Related Questions