IvanHid
IvanHid

Reputation: 709

Microsoft.Rest.ValidationException While trying to create a reply

I'm using the Microsoft Bot Framework with C# and I'm trying to create a reply message with an image like so:

IMessageActivity m = Activity.CreateMessageActivity();
var images = doc.DocumentNode.SelectNodes("//img[@src]").ToList();
var src = images[10].GetAttributeValue("src", null);
Attachment att = new Attachment();
att.ContentType = "image";
att.ContentUrl = src;
m.Attachments.Add(att);
await context.PostAsync(m);
context.Wait(MessageReceived);

I know that the image source is being extracted correctly but I still get the error:

Microsoft.Rest.ValidationException

What is the cause of this and how do I fix it? I expect to have a message with the image attached but instead I just get the default bot code error message. Edit: this is the exception message - 'ReplyToId' cannot be null.

Upvotes: 0

Views: 778

Answers (1)

Anita George
Anita George

Reputation: 1153

If you are creating a message using the Activity.CreateMessageActivity() then you need to specify the details of user account(ToId,ToName), bot account(FromId, FromName) and conversation(conservationId, channelId).

eg:

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 = "The text you want to send";
//You can add your attachment here
message.Locale = "en-Us";
await connector.Conversations.SendToConversationAsync((Activity)message);

Looking at your code it looks like you can access the context of the Dialog since you are posting the message using context.PostAsync, so the easier way would be to send a message using the context since the context will already contain the details of user, bot and conversation.

You can do this by using context.MakeMessage()

eg:

IMessageActivity reply = context.MakeMessage();

var images = doc.DocumentNode.SelectNodes("//img[@src]").ToList();
var src = images[10].GetAttributeValue("src", null);
Attachment att = new Attachment();
att.ContentType = "image/png";
att.ContentUrl = src;

reply.Attachments.Add(att);
await context.PostAsync(reply);
context.Wait(MessageReceived);

Upvotes: 2

Related Questions