【问题标题】:Twilio Messaging Webhook - Unsupported Media Type - Asp.net Core 3.1 APITwilio 消息传递 Webhook - 不支持的媒体类型 - Asp.net Core 3.1 API
【发布时间】:2021-03-20 05:09:35
【问题描述】:

我有一个带有端点的 asp.net core (3.1) web api,用于接受 Twilio 消息传递 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);
    }
  }

当我在邮递员的标题中包含 Content-Type:application/json 时,它可以工作。

我也试过添加

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

还有

[Consumes("application/xml")]

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

【问题讨论】:

    标签: asp.net-core twilio asp.net-core-3.1


    【解决方案1】:

    正如其他答案所提到的,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] 属性,但这不是必需的。

    【讨论】:

      【解决方案2】:

      所以我意识到 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

      【讨论】:

      • 不需要端点显式路由配置,通常的app.UseRouting(); app.UseEndpoints(endpoints => endpoints.MapControllers()); 工作正常。事实上,使用[ApiController] 装饰控制器会导致此错误。
      【解决方案3】:

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

      Webhooks FAQ

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

      如果当您在邮递员的标头中设置Content-Type:application/json 时它可以工作,那么有些事情是关闭的,因为它应该期望并消耗application/x-www-form-urlencoded

      【讨论】:

      • 因此,当我将 [Consumes("application/x-www-form-urlencoded")] 添加到调用中时,consumes 属性文档说它会查找 Twilio 的参数“Content-Type”不发送其标头。因此,即使我将它设置为期望它,我也会收到错误,因为 API 无法确定媒体类型。我尝试添加一个属性来添加标题...没有运气。
      • 这是我在发送 SMS 时在 Twilio Webhook 中看到的内容,Content-Type application/x-www-form-urlencoded; charset=utf-8
      猜你喜欢
      • 2017-08-19
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多