首页 > 解决方案 > 向 Twilio 发送重定向 Uri 到同一控制器中的另一个操作

问题描述

我正在尝试将 Twilio 重定向 URI 发送到同一控制器中的另一个操作。我无法提供完整的 Uri,因为我正在开发中并且我正在使用 localhost。我想我会使用一个相对的 Uri。它的编写方式是,当我尝试重定向到“RouteCall”时,我不断收到“欢迎”的反馈。

作为旁注,MVC 中的路由似乎非常多余。如果不明确使用您看到的 Route 标记,我无法让路由工作。

using System;
using Microsoft.AspNetCore.Mvc;
using Twilio.AspNet.Core;
using Twilio.TwiML;

namespace centurionvoice.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class VoiceController : TwilioController
    {
        [Route("welcome")]
        public IActionResult Welcome()
        {
            Uri newUri = new Uri("/RouteCall", UriKind.Relative);
            var response = new VoiceResponse();
            response.Say("Thank you for calling. To do some thing, press 1. To do another thing, press 0.");
            response.Gather(numDigits: 1);

            response.Redirect(newUri);
            return TwiML(response);
        }

        [Route("routecall")]
        [AcceptVerbs("GET", "POST")]
        public IActionResult RouteCall(string digits)
        {
            var response = new VoiceResponse();

            if (digits.Equals("1"))
            {
                //Dial the someone else
                response.Say("You are being trasferred.");
                return TwiML(response);
            }
            else
            {
                //Record a message
                response.Say("Please record your message.");
                response.Gather();
                return TwiML(response);
            }
        }
    }
}

标签: asp.net-core-mvctwilio

解决方案


我做的第一件事是修改 Startup.cs 来配置基本/直观的路由。

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "api/{controller=Voice}/{action=Index}/{id?}");
            });
        }

然后回到 VoiceController,new Uri() 不再抛出错误:

        [HttpPost]
        public IActionResult Index()
        {
            var response = new VoiceResponse();
            var gather = new Gather(numDigits: 1, action: new Uri("/api/voice/gather", UriKind.Relative));
            gather.Say("To do one thing, press 1. To do another thing, press 0.", voice: "Polly.Nicole");
            response.Append(gather);

            // If the user doesn't enter input, loop
            response.Redirect(new Uri("/api/voice", UriKind.Relative));

            return TwiML(response);
        }

推荐阅读