Twilio消息传递Webhook-不支持的媒体类型-Asp.net Core 3.1 API

问题描述

我有一个带有端点的asp.net核心(3.1)Web API,可以接受Twilio Messaging 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);
    }
  }

当邮递员的标头中具有Content-Type:application / json时,它可以工作。

我也尝试添加

[Consumes("application/x-www-form-urlencoded")]

以及

[Consumes("application/xml")]

并且都仍然获得不受支持媒体类型...无法弄清楚Twilio发送了什么,或者我需要做些什么才能使其与Webhook兼容。

解决方法

正如其他答案所述,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
    }
}

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

,

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

Webhooks FAQ

“对于入站文本消息,Twilio将使用使用application / x-www-form-urlencoded编码的正文将HTTP POST请求发送到您的服务器。查看在该请求中发送的list of parameters。”

如果在邮递员的标头中设置Content-Type:application/json时可以使用,则出现了一些问题,因为它应该预期并消耗application/x-www-form-urlencoded

,

因此,我意识到ApiController是要扔掉它的东西。我删除了所有属性,并在启动时添加了正确的路由,并且可以正常工作。

 public class SmsController : TwilioController
  {
    public TwiMLResult WebHook(SmsRequest incomingMessage)
    {
      var messagingResponse = new MessagingResponse();
      if (incomingMessage != null)
      {
        messagingResponse.Message($"The copy cat says: {incomingMessage.Body}");
      }
      else
      {
        messagingResponse.Message($"Recieved SMS but body was null");
      }


      return TwiML(messagingResponse);
    }
  }

在启动时添加了端点

endpoints.MapControllerRoute(
name: "sms",pattern: "sms/{Action}",defaults: new { Controller = "Sms"});

并且Webhook URL为https:// OURURL / sms / WebHook