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 是否遵循这些重定向的文档,但在这种情况下我假设它不是。
我会将代码从您的两个额外操作 diaryQuestions
和 unknownCode
移至原始操作,并直接从那里 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);
}
这是被成功命中的控制器路由:
[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 是否遵循这些重定向的文档,但在这种情况下我假设它不是。
我会将代码从您的两个额外操作 diaryQuestions
和 unknownCode
移至原始操作,并直接从那里 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);
}