RedirectToAction 传递到当前操作的结尾并且无处可去

RedirectToAction passes to end of current action and goes nowhere

这是被成功命中的控制器路由:

[Route("begin")]
    public ActionResult BeginSmsMessaging(SmsRequest message)
    {            
        string from = message.From;

        var phoneNumber = from.Replace("+1", "").FormatPhoneNumber();            

        _commandPipeline.Publish(new LogInboundMessage
        {
            PhoneNumber = phoneNumber,
            TimestampUtc = DateTime.UtcNow
        });

        int code;
        if(int.TryParse(message.Body, out code)) 
        {
            try
            {
                return RedirectToAction("DiaryQuestions");
            }
            catch(Exception e)
            {
                string error = e.Message;
                return null;
            }                
        }
        else
        {
            return RedirectToAction("UnknownCode");
        }
    }

RedirectToAction("DiaryQuestions") 和 RedirectToAction("UnknownCode") 都没有成功重定向。相反,执行移动到当前 BeginSmsMessaging 操作的末尾,然后滑入 IoC 代码,在该代码中控制器被释放并且程序执行刚刚停止。

这是无法访问的 DiaryQuestions 操作:

[Route("diaryQuestions")]
    public ActionResult DiaryQuestions(SmsRequest message)
    {
        var response = new TwilioResponse();
        response.SetAttributeValue("PhoneNumber", message.From);
        response.SetAttributeValue("DiaryQuestion", "1");
        response.Message("This is a test message.");
        response.Sms("This is a test SMS");
        return TwiML(response);
    }

以及无法访问的 UnknownCode 操作:

[Route("unknownCode")]
    public ActionResult UnknownCode(SmsRequest message)
    {
        var response = new TwilioResponse();

        response.Sms("What to say...");

        return TwiML(response);
    }

控制台或 Windows 事件查看器中均未抛出任何错误。此外,在 RedirectToAction 调用之前一切看起来都很好 - 输入参数和变量都已正确填充。

目前我不知道会发生什么。 :(

此处为 Twilio 开发人员布道师。

我相信 Andy 的评论可能是正确的。因为您正在 return 进行重定向,所以这将向 Twilio 发送 301 响应。我无法轻易找到有关 Twilio 是否遵循这些重定向的文档,但在这种情况下我假设它不是。

我会将代码从您的两个额外操作 diaryQuestionsunknownCode 移至原始操作,并直接从那里 return TwiML

类似于:

[Route("begin")]
    public ActionResult BeginSmsMessaging(SmsRequest message)
    {            
        string from = message.From;

        var phoneNumber = from.Replace("+1", "").FormatPhoneNumber();            

        _commandPipeline.Publish(new LogInboundMessage
        {
            PhoneNumber = phoneNumber,
            TimestampUtc = DateTime.UtcNow
        });

        var response = new TwilioResponse();

        int code;
        if(int.TryParse(message.Body, out code)) 
        {
            try
            {
                response.SetAttributeValue("PhoneNumber", message.From);
                response.SetAttributeValue("DiaryQuestion", "1");
                response.Message("This is a test message.");
                response.Sms("This is a test SMS");
            }
            catch(Exception e)
            {
                string error = e.Message;
                return null;
            }                
        }
        else
        {
            response.Sms("What to say...");
        }

        return TwiML(response);
    }