首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异常:使用context.Forward()和AuthBot时堆栈为空?

异常:使用context.Forward()和AuthBot时堆栈为空?
EN

Stack Overflow用户
提问于 2017-07-18 21:48:31
回答 1查看 405关注 0票数 1

我正在遵循AuthBot教程中的SampleAADv2Bot示例。我要使用已配置的Azure Active Directory对我的机器人进行身份验证。我用下面的图片设置了我的Web.Config。除了我的类名为LoginDialog.cs之外,我的对话框类中的代码与列出的here相同。然而,我在模拟器中看到了这个异常:

当我在我的代码中(在LoginDialog.cs中)进行此调用时,出现错误:

代码语言:javascript
运行
复制
 await context.Forward(new AzureAuthDialog(AuthSettings.Scopes), this.ResumeAfterAuth, message, CancellationToken.None);

这是我的LoginDialog类。实现了ResumeAfterAuth()。

LoginDialog.cs:

代码语言:javascript
运行
复制
// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT 
license. See full license at the bottom of this file.
namespace Bot.Dialogs
{
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using AuthBot;
    using AuthBot.Dialogs;
    using AuthBot.Models;
    using Microsoft.Bot.Builder.Dialogs;
    using Microsoft.Bot.Connector;

    [Serializable]
    public class LoginDialog : IDialog<string>
    {
        public async Task StartAsync(IDialogContext context)
        {
            context.Wait(MessageReceivedAsync);
        }

        public async Task TokenSample(IDialogContext context)
        {
            //endpoint v2
            var accessToken = await context.GetAccessToken(AuthSettings.Scopes);

            if (string.IsNullOrEmpty(accessToken))
            {
                return;
            }

            await context.PostAsync($"Your access token is: {accessToken}");

            context.Wait(MessageReceivedAsync);
        }

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

            if (message.Text == "logon")
            {
                //endpoint v2
                if (string.IsNullOrEmpty(await context.GetAccessToken(AuthSettings.Scopes)))
                {
                    await context.Forward(new AzureAuthDialog(AuthSettings.Scopes), this.ResumeAfterAuth, message, CancellationToken.None);
                }
                else
                {
                    context.Wait(MessageReceivedAsync);
                }
            }
            else if (message.Text == "echo")
            {
                await context.PostAsync("echo");

                context.Wait(this.MessageReceivedAsync);
            }
            else if (message.Text == "token")
            {
                await TokenSample(context);
            }
            else if (message.Text == "logout")
            {
                await context.Logout();
                context.Wait(this.MessageReceivedAsync);
            }
            else
            {
                context.Wait(MessageReceivedAsync);
            }
        }

        private async Task ResumeAfterAuth(IDialogContext context, IAwaitable<string> result)
        {
            var message = await result;

            await context.PostAsync(message);
            context.Wait(MessageReceivedAsync);
        }
    }
}

这是我的MessagesController.cs:

代码语言:javascript
运行
复制
namespace Bot
{
    //[BotAuthentication]
    public class MessagesController : ApiController
    {

        public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        {

            if (activity.Type == ActivityTypes.ConversationUpdate)
            {
            }
            else if (activity.Type == ActivityTypes.Message)
            {

                if (activity.Text.Contains("logon") || activity.Text.Contains("login"))
                {
                    await Conversation.SendAsync(activity, () => new Dialogs.LoginDialog());
                }
                else
                {
                    // Sends user's Id and Name to RootDialog Class
                    StateClient stateClient = activity.GetStateClient();
                    BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
                    userData.SetProperty<string>("UserId", activity.From.Id);
                    userData.SetProperty<string>("Name", activity.From.Name);

                    // send these values in the Context
                    await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);


                    await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
                }

            }
            else if (activity.Type == ActivityTypes.Invoke)
            {
               //...

            }
            else
            {
                HandleSystemMessage(activity);
            }
            var response = Request.CreateResponse(HttpStatusCode.OK);
            return response;
        }


    private Activity HandleSystemMessage(Activity activity)
    { 
        //...
    }

}

编辑#1:在我的代码中设置断点后,看起来错误发生在WebApiConfig.cs文件中:

代码语言:javascript
运行
复制
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
   ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting = Newtonsoft.Json.Formatting.Indented,
                NullValueHandling = NullValueHandling.Ignore,
};

编辑#2:错误发生在到达下图所示的行之后:

当到达此行时,message为空。它立即离开这个函数并返回到这一行:

await context.Forward(new AzureAuthDialog(AuthSettings.Scopes), this.ResumeAfterAuth, message, CancellationToken.None);

然后返回到EDIT #1所示的WebApiConfig中的JSON行,运行函数JsonSerializerSettings()两次,然后抛出异常。

下面是异常的输出视图:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-19 23:27:29

我发现了这个问题。我需要在我的Global.asax.cs文件中的GlobalConfiguration.Configure(WebApiConfig.Register);行下添加以下行:

代码语言:javascript
运行
复制
AuthSettings.Mode = ConfigurationManager.AppSettings["ActiveDirectory.Mode"];
AuthSettings.EndpointUrl = ConfigurationManager.AppSettings["ActiveDirectory.EndpointUrl"];
AuthSettings.Tenant = ConfigurationManager.AppSettings["ActiveDirectory.Tenant"];
AuthSettings.RedirectUrl = ConfigurationManager.AppSettings["ActiveDirectory.RedirectUrl"];
AuthSettings.ClientId = ConfigurationManager.AppSettings["ActiveDirectory.ClientId"];
AuthSettings.ClientSecret = ConfigurationManager.AppSettings["ActiveDirectory.ClientSecret"];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45168712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档