3
votes

On SubmitAction action in Adaptive Cards (botframework, c#, emulator, localhost) I get this Exception

Exception: Value cannot be null. Parameter name: stringToEscape
[File of type 'text/plain']

Can you help me point out what am doing wrong?

card.Actions.Add(
    new SubmitAction()
    {
        Title = "Submit"
        Data = Newtonsoft.Json.Linq.JObject.FromObject(new { button = "Submit", ServerUrl = "idServerURL" })
    }
);

From RootDialog - LUIS Intent is called

[LuisIntent("ServerAuth")]
public async Task ServerAuthIntentActionResultHandlerAsync(IDialogContext 
context, IAwaitable<IMessageActivity> activity, LuisResult result)
{
    var message = await activity;
    await context.PostAsync($"Am working on it...'{message.Text}' ");

    var serverAuthAction = new ServerAuthAction();

    // Action to execute if no form is required - Based on LUIS result, call fulfillment methods From/To ERP Data and proceed to next stage of dialog
    await serverAuthAction.ResumeActionServerAuthFormDialog(context, result);

    //context.Wait(this.MessageReceived);

}

public async Task ResumeActionServerAuthFormDialog(IDialogContext context, LuisResult result)
{
    try
    {
        //Based on the LUIS Result, fetch data from AppServer
        //var searchQuery =  result;

        //Data - Assign value to this Model from AppServer fetched data
        ServerAuthModel serverAuthData = new ServerAuthModel();
        serverAuthData = default(ServerAuthModel);

        //For testing populate values by hardcoding - /May/2017
        ServerAuthAdaptiveCardView serverAuthView = new ServerAuthAdaptiveCardView();

        //Pass Data to Channel Adaptive Card View 
        var resultData = serverAuthView.GetServerAuthAdaptiveCard();

        var resultMessage = context.MakeMessage();

        resultMessage.Attachments.Add(resultData);

        await context.PostAsync(resultMessage);
    }
    catch (Exception ex)
    {
        ...
    }
    finally
    {
        ....
    }
}

GetServerAuthAdaptiveCard() has the Submit Action code.

public Attachment GetServerAuthAdaptiveCard()
{
    AdaptiveCard card = new AdaptiveCard();
    card.FallbackText = "App Server Authentication";
    card.Body.Add(
        new TextInput()
        {
            Id = "idServerURL",
            IsRequired = true,
            Placeholder = "App Server URL",
            MaxLength = 100,
            IsMultiline = false,
            Style = TextInputStyle.Url,
            Speak = "App Server URL",
        });

    card.Body.Add(
        new ChoiceSet()
        {
            Id = "idAuthCompany",
            IsRequired = true,
            IsMultiSelect = false,
            Style = ChoiceInputStyle.Compact,
            Speak = "Company to Authenticate for",
            Value = "DocM5",
            Choices = new List<Choice>() {
                new Choice()
                {
                    Title = "P2PDemo",
                    Value = "P2PDemo",
                    IsSelected = true,
                    Speak = "P2PDemo"
                },
                new Choice()
                {
                    Title = "SalesDemo",
                    Value = "SalesDemo",
                    IsSelected = false,
                    Speak = "SalesDemo"
                }
            }
        });
    card.Body.Add(
        new TextInput()
        {
            Id = "idBranchName",
            IsRequired = true,
            Placeholder = "App Branch",
            MaxLength = 100,
            IsMultiline = false,
            Style = TextInputStyle.Text,
            // Value = ""
        });

    var submitActionData = JObject.Parse("{ \"Type\": \"idServerURL\" }");


    card.Actions.Add(
        /*  new SubmitAction()
        {
            Title = "Submit",
            // Speak = "Submit",
            Data = Newtonsoft.Json.Linq.JObject.FromObject(new { button = "Submit", ServerUrl = "idServerURL" })
        }
        */
        new SubmitAction()
        {
            DataJson = submitActionData.ToString()
        });

    var attachment = new Attachment() { ContentType = AdaptiveCard.ContentType, Content = card };
    return attachment;
}

Exception from Emulator:

"contentType": "text/plain",
"content": "   at System.Uri.EscapeDataString(String stringToEscape)
    at Microsoft.Bot.Builder.Luis.LuisRequest.BuildUri(ILuisModel model)
    at Microsoft.Bot.Builder.Luis.LuisService.Microsoft.Bot.Builder.Luis.ILuisService.BuildUri(LuisRequest luisRequest)
    at Microsoft.Bot.Builder.Luis.Extensions.<QueryAsync>d__4.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.LuisDialog`1.<MessageReceived>d__8.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.ThunkResume`1.<Rest>d__5.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Internals.Fibers.Wait`2.<Microsoft-Bot-Builder-Internals-Fibers-IWait<C>-PollAsync>d__19.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Internals.Fibers.Frame`1.<Microsoft-Bot-Builder-Internals-Fibers-IFrameLoop<C>-PollAsync>d__9.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Internals.Fibers.Fiber`1.<Microsoft-Bot-Builder-Internals-Fibers-IFiberLoop<C>-PollAsync>d__16.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    at Microsoft.Bot.Builder.Internals.Fibers.Wait`2.Microsoft.Bot.Builder.Internals.Fibers.IAwaiter<T>.GetResult()
    at Microsoft.Bot.Builder.Dialogs.Chain.LoopDialog`1.<ResumeAsync>d__3.MoveNext()
    -- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.ThunkResume`1.<Rest>d__5.MoveNext()
    --- End of stack trace from previous location where exception was thrown --
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Internals.Fibers.Wait`2.<Microsoft-Bot-Builder-Internals-Fibers-IWait<C>-PollAsync>d__19.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Internals.Fibers.Frame`1.<Microsoft-Bot-Builder-Internals-Fibers-IFrameLoop<C>-PollAsync>d__9.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Internals.Fibers.Fiber`1.<Microsoft-Bot-Builder-Internals-Fibers-IFiberLoop<C>-PollAsync>d__16.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.<Microsoft-Bot-Builder-Base-IEventLoop-PollAsync>d__23.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.ReactiveDialogTask.<Microsoft-Bot-Builder-Base-IEventLoop-PollAsync>d__3.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.ScoringEventLoop`1.<Microsoft-Bot-Builder-Base-IEventLoop-PollAsync>d__5.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.EventLoopDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__3.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.SetAmbientThreadCulture.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__3.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.QueueDrainingDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__4.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__3.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__3.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.ExceptionTranslationDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__2.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.SerializeByConversation.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__4.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at Microsoft.Bot.Builder.Dialogs.Internals.PostUnhandledExceptionToUser.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d__5.MoveNext()"
3
Can you add more code for your implementation? thanksNicolas R
Hi, yes included from where this is called. thanksSangeetha
Please add all the necessary code, for example here your method 'GetServerAuthAdaptiveCard()' is not detailedNicolas R
Included the method implementationSangeetha
We need also LuisModel declaration (without real values) as the exception seems no to be in your AdaptiveCardNicolas R

3 Answers

2
votes

Try filling the DataJson property instead of the Data one.

var submitActionData = JObject.Parse("{ \"Type\": \"HotelSelection\" }");

var action = new SubmitAction()
{
    DataJson = submitActionData.ToString()
}

Update based on new details added to the question.

Per the full exception, the problem is around LUIS and not with the Adaptive card. Specifically, the problem is arising in the BuildUri method of the LuisService class (which is being called by the LuisDialog). The exception is also telling us that the problem is happening when the EscapeDataString method is being called.

If you look carefully to the BuildUri method, you will see that there are 10 calls to the EscapeDataString method. Some of these calls are against values from the service itself, which I don't think you are modifying; however other ones are over values from the LuisModel, like SubscriptionKey and ModelId and also there is one over the Query to be sent to LUIS.

That being said, my recommendation is to review the values you set in the LuisModel attribute that is decorating your LuisDialog based class.

If you are unsure how LUIS + Bot Framework works, I would recommend you to take a look at the intelligence-LUIS sample.

0
votes

You are getting this error because when you click on the submit button on Adaptive card it calls the POST method of your BOT Framework. At which time Activity.Text field is NULL. You should check in the POST method if Activity.Text field is NULL; if it is, then you should not call LUIS for the intent check.

0
votes

This is how I did it, to make it work for Microsoft teams. Else for the emulator, you simply pass a string in Data.

dynamic dataObject = new JObject();
dataObject.msteams = new JObject();
dataObject.msteams.type = "imBack";
dataObject.msteams.value = intent.Value;
var actionSubmit = new AdaptiveSubmitAction(){
    Title = intent.Value,
    Data = turnContext.Activity.ChannelId != "emulator" ?  dataObject : intent.Value
};