Twilio Messaging Webhook - 不支持的媒体类型 - Asp.net Core 3.1 API

Bra*_*rpy 9 twilio asp.net-core asp.net-core-3.1

我有一个 asp.net core (3.1) Web api,带有一个端点来接受 Twilio Messaging Webhook。当我从邮递员本地运行它时,它可以工作,当 webhook 发布时,我收到 415“不支持的媒体类型”

[ApiController]
[Route("[controller]")]
public class TwillioController : TwilioController
{
    [HttpPost("ProcessIncomingMessage")]
    public TwiMLResult ProcessIncomingMessage(SmsRequest incomingMessage)
    {
      Console.WriteLine($"Recieved new SMS from {incomingMessage.From}");
      var messagingResponse = new MessagingResponse();
      messagingResponse.Message("The copy cat says: " +
                                incomingMessage.Body);

      return TwiML(messagingResponse);
    }
  }
Run Code Online (Sandbox Code Playgroud)

当我在邮递员的标头中包含 Content-Type:application/json 时,它会起作用。

我也尝试过添加

[Consumes("application/x-www-form-urlencoded")]
Run Code Online (Sandbox Code Playgroud)

[Consumes("application/xml")]
Run Code Online (Sandbox Code Playgroud)

并且两者仍然得到不受支持的媒体类型...无法弄清楚 Twilio 正在发送什么或我需要做什么才能使其与他们的 webhook 兼容。

Mic*_*ris 9

正如其他答案提到的,Twilio 发送内容类型为 的请求x-www-form-urlencoded。用属性注释的控制器中的操作需要在参数上[ApiController]有一个属性才能工作,如下所示:[FromForm]

[ApiController]
public class TwilioController : ControllerBase
{
    [HttpPost("")]
    public TwiMLResult Post([FromForm] SmsRequest request)
    {
        // do stuff with the SMS request
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然您可以包含[Consumes]属性,但这不是必需的。


小智 1

以下是 Twilio 发送到您的应用程序的详细信息,因此application/x-www-form-urlencoded100% 正确。

Webhook 常见问题解答

“对于入站文本消息,Twilio 将向您的服务器发送 HTTP POST 请求,其正文使用 application/x-www-form-urlencoded 编码。查看该请求中发送的参数列表。”

Content-Type:application/json如果当您在邮递员中设置标头时它起作用,那么有些东西就会关闭,因为它应该期望并消耗application/x-www-form-urlencoded