.NET Core API 中的 Twilio StatusCallBack & Gather POST 方法返回 HTTP 415 - 不支持的媒体类型
Twilio StatusCallBack & Gather POST method in .NET Core API returning HTTP 415 - Unsupported Media Type
下面是我对这两种方法的代码 -
GatherCall
正在返回 Twiml,我仍然得到 HTTP 415 并且 StatusCallback
方法也是如此。有人可以帮忙吗?我什至无法使用 ngrok 对此进行测试,因为隧道工具在我的组织网络中不起作用。我正在使用 Azure 通过记录所有内容来测试这个。
public TwiMLResult GatherCall([FromRoute] string id, [FromBody] VoiceRequest voiceRequest )
{
_logger.LogInformation("*****************GatherCall - Start****************");
var response = new VoiceResponse();
try
{
_logger.LogInformation("Gather call back for -" + id);
_logger.LogInformation("VoiceRequest parameters-------------------------");
_logger.LogInformation("CallSid : " + voiceRequest.CallSid);
_logger.LogInformation("CallStatus : " + voiceRequest.CallStatus);
_logger.LogInformation("AccountSid : " + voiceRequest.AccountSid);
_logger.LogInformation("From : " + voiceRequest.From);
_logger.LogInformation("To : " + voiceRequest.To);
_logger.LogInformation("Digits : " + voiceRequest.Digits);
_logger.LogInformation("Direction : " + voiceRequest.Direction);
_logger.LogInformation("TranscriptionText : " + voiceRequest.TranscriptionText);
if (voiceRequest.Digits == "1234")
{
response.Say("Your response has been recorded. Thank you.", voice: "alice");
response.Hangup();
//acctepted response
//update call status to db
//acknowledge incident
}
else
{
response.Say("Incorrect code enterted. Please enter correct code to accespt this incident", voice: "alice");
response.Pause(3);
response.Hangup();
}
_logger.LogInformation("*****************GatherCall - EndTry****************");
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogInformation("*****************GatherCall - EndCatch****************");
}
return TwiML(response);
// return TwiML(response.ToString(), "application/xml");
}
public IActionResult StatusCallBack([FromRoute] string id, [FromBody] StatusCallbackRequest statusCallbackRequest)
{
_logger.LogInformation("*****************StatusCallBack - Start****************");
try
{
_logger.LogInformation("Status call back called for -" + id );
_logger.LogInformation("StatusCallbackRequest parameters-------------------------");
_logger.LogInformation("CallSid : " + statusCallbackRequest.CallSid);
_logger.LogInformation("CallStatus : " + statusCallbackRequest.CallStatus);
_logger.LogInformation("AccountSid : " + statusCallbackRequest.AccountSid);
_logger.LogInformation("From : " + statusCallbackRequest.From);
_logger.LogInformation("To : " + statusCallbackRequest.To);
_logger.LogInformation("Digits : " + statusCallbackRequest.Digits);
_logger.LogInformation("Direction : " + statusCallbackRequest.Direction);
_logger.LogInformation("TranscriptionText : " + statusCallbackRequest.TranscriptionText);
_logger.LogInformation("*****************StatusCallBack - EndTry****************");
return Ok("Handled");
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogInformation("*****************StatusCallBack - EndCatch****************");
return Ok("Handled in catch");
}
}
这里是 Twilio 传播者...很抱歉让您遇到困难。看起来您的代码正在尝试将 voiceRequest
参数绑定到来自 Twilio 的传入 POST 请求的主体(使用 [FromBody]
)。如果 Twilio 正在发送 POST 请求,您需要绑定到表单 (using [FromForm]
)。否则,ASP.NET 核心将 return 一个 415 错误代码。
尝试用 [FromForm]
替换 [FromBody]
。这应该可以根据 POST 请求解决此问题。我还建议验证 Twilio 实际上发送的是 POST,而不是 GET 请求。
如果您 运行 遇到更多问题,请通过电子邮件将说明发送至 corey@twilio.com。希望这有帮助。
下面是我对这两种方法的代码 -
GatherCall
正在返回 Twiml,我仍然得到 HTTP 415 并且 StatusCallback
方法也是如此。有人可以帮忙吗?我什至无法使用 ngrok 对此进行测试,因为隧道工具在我的组织网络中不起作用。我正在使用 Azure 通过记录所有内容来测试这个。
public TwiMLResult GatherCall([FromRoute] string id, [FromBody] VoiceRequest voiceRequest )
{
_logger.LogInformation("*****************GatherCall - Start****************");
var response = new VoiceResponse();
try
{
_logger.LogInformation("Gather call back for -" + id);
_logger.LogInformation("VoiceRequest parameters-------------------------");
_logger.LogInformation("CallSid : " + voiceRequest.CallSid);
_logger.LogInformation("CallStatus : " + voiceRequest.CallStatus);
_logger.LogInformation("AccountSid : " + voiceRequest.AccountSid);
_logger.LogInformation("From : " + voiceRequest.From);
_logger.LogInformation("To : " + voiceRequest.To);
_logger.LogInformation("Digits : " + voiceRequest.Digits);
_logger.LogInformation("Direction : " + voiceRequest.Direction);
_logger.LogInformation("TranscriptionText : " + voiceRequest.TranscriptionText);
if (voiceRequest.Digits == "1234")
{
response.Say("Your response has been recorded. Thank you.", voice: "alice");
response.Hangup();
//acctepted response
//update call status to db
//acknowledge incident
}
else
{
response.Say("Incorrect code enterted. Please enter correct code to accespt this incident", voice: "alice");
response.Pause(3);
response.Hangup();
}
_logger.LogInformation("*****************GatherCall - EndTry****************");
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogInformation("*****************GatherCall - EndCatch****************");
}
return TwiML(response);
// return TwiML(response.ToString(), "application/xml");
}
public IActionResult StatusCallBack([FromRoute] string id, [FromBody] StatusCallbackRequest statusCallbackRequest)
{
_logger.LogInformation("*****************StatusCallBack - Start****************");
try
{
_logger.LogInformation("Status call back called for -" + id );
_logger.LogInformation("StatusCallbackRequest parameters-------------------------");
_logger.LogInformation("CallSid : " + statusCallbackRequest.CallSid);
_logger.LogInformation("CallStatus : " + statusCallbackRequest.CallStatus);
_logger.LogInformation("AccountSid : " + statusCallbackRequest.AccountSid);
_logger.LogInformation("From : " + statusCallbackRequest.From);
_logger.LogInformation("To : " + statusCallbackRequest.To);
_logger.LogInformation("Digits : " + statusCallbackRequest.Digits);
_logger.LogInformation("Direction : " + statusCallbackRequest.Direction);
_logger.LogInformation("TranscriptionText : " + statusCallbackRequest.TranscriptionText);
_logger.LogInformation("*****************StatusCallBack - EndTry****************");
return Ok("Handled");
}
catch (Exception ex)
{
_logger.LogError(ex.Message);
_logger.LogInformation("*****************StatusCallBack - EndCatch****************");
return Ok("Handled in catch");
}
}
这里是 Twilio 传播者...很抱歉让您遇到困难。看起来您的代码正在尝试将 voiceRequest
参数绑定到来自 Twilio 的传入 POST 请求的主体(使用 [FromBody]
)。如果 Twilio 正在发送 POST 请求,您需要绑定到表单 (using [FromForm]
)。否则,ASP.NET 核心将 return 一个 415 错误代码。
尝试用 [FromForm]
替换 [FromBody]
。这应该可以根据 POST 请求解决此问题。我还建议验证 Twilio 实际上发送的是 POST,而不是 GET 请求。
如果您 运行 遇到更多问题,请通过电子邮件将说明发送至 corey@twilio.com。希望这有帮助。