Twilio TwiML响应中的URL安全操作

时间:2017-07-14 22:45:17

标签: c# asp.net twilio

为了简洁起见,我有一个接收一些参数的端点,并返回一个TwiML响应,将调用重定向到另一个端点以收集用户的DTMF响应:

[HttpGet]
public async MyEndpoint<ActionResult> Test(string parameterOne, string parameterTwo)
{
    var response = new VoiceResponse()
        .Redirect(
            url: $"https://example.com/Gather?parameterOne={parameterOne}&parameterTwo={parameterTwo}",
            method: "POST");

    return TwiML(response);
}

生成以下XML:

<?xml version="1.0" encoding="utf-8"?>
<Response>
    <Redirect method="POST">https://example.com/Gather?paramaterOne="test"&amp;parameterTwo="test"</Redirect>
</Response>

想法是Twilio应该将它的标准请求对象发布到此端点,但是在查询字符串中包含我的参数:

[HttpPost]
public async Task<ActionResult> Gather([FromUri] string parameterOne, string parameterTwo [FromBody] TwilioCallbackRequest request)
{
    // Do stuff
}

但是,请求失败是因为Web编码器未将XML编码的&amp;理解为查询字符串分隔符。

理想情况下,有一种方法可以修改Twilio请求的表单值以包含我需要传递的参数,但我不相信该功能存在。

我的问题是:

一个。有没有办法让Twilio对它的查询进行URL编码?或者

B中。在我有机会处理请求之前,接受在ASP.NET中以这种方式格式错误而没有错误的查询字符串的最佳方法是什么?

目前我的hacky解决方法是将我的查询字符串参数作为一个大的下划线分隔字符串发送并手动解析我的参数,但我怀疑这是最好的方法。我还考虑过使用OWIN中间件拦截请求并尝试修改此端点的查询字符串。

1 个答案:

答案 0 :(得分:1)

Twilio Dev Evangelist在这里......

您似乎正在使用Twilio和Twilio.AspNet.Mvc软件包来返回您的回复。您还可以通过为Get方法准备响应来实现目标,而无需使用Twilio.AspNet.Mvc包。这是一个例子:

[HttpGet]
public HttpResponseMessage Get(string parameterOne, string parameterTwo)
{
    var response = new VoiceResponse()
        .Redirect(
            url: $"https://example.com/Gather?paramaterOne={parameterOne}&parameterTwo={parameterTwo}",
        method: "POST");
    var content = new StringContent(response.ToString(), Encoding.UTF8, "application/xml");
    return new HttpResponseMessage
    {
        Content = content,
        StatusCode = HttpStatusCode.OK
    };
}

尝试一下,如果遇到问题请告诉我。