You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ASP.NET MVC控制器获取Twilio MMS中的文件附件?

解决Twilio MMS附件获取问题(ASP.NET MVC VB.NET)

核心说明

Twilio发送到Webhook的MMS请求参数,已包含在你当前使用的SmsRequest对象中,不存在单独的MmsRequest类型。媒体相关属性遵循以下命名规则:

  • NumMedia:附件总数
  • MediaUrl{n}:第n个附件的访问URL(n从0开始,如MediaUrl0、MediaUrl1)
  • MediaContentType{n}:第n个附件的MIME类型(如application/pdf)

修改后的代码示例

更新SMSController,添加MMS附件的获取与处理逻辑:

Imports System.Web.Mvc
Imports Twilio.AspNet.Common
Imports Twilio.AspNet.Mvc
Imports Twilio.TwiML
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text

Namespace Controllers
    Public Class SMSController
        Inherits TwilioController

        ' 替换为你的Twilio账号SID和Auth Token
        Private ReadOnly AccountSid As String = "你的Twilio账号SID"
        Private ReadOnly AuthToken As String = "你的Twilio Auth Token"

        Function Index(ByVal IncomingMessage As SmsRequest) As TwiMLResult
            Dim SMSResponse As New MessagingResponse
            Dim MessageBody As String = IncomingMessage.Body
            Dim JediCode As String = "There is no emotion, there is peace."
            Dim SithCode As String = "Peace is a lie. There is only Passion."

            JediCode += vbCrLf & "There is no ignorance, there is knowledge."
            JediCode += vbCrLf & "There is no passion, there is serenity."
            JediCode += vbCrLf & "There is no chaos, there is harmony."
            JediCode += vbCrLf & "There is no death, there is the Force."

            SithCode += vbCrLf & "Through Passion, I gain Strength."
            SithCode += vbCrLf & "Through Strength, I gain Power."
            SithCode += vbCrLf & "Through Power, I gain Victory."
            SithCode += vbCrLf & "Through Victory my chains are Broken."
            SithCode += vbCrLf & "The Force shall free me."

            ' 处理MMS附件
            If IncomingMessage.NumMedia > 0 Then
                For i As Integer = 0 To IncomingMessage.NumMedia - 1
                    ' 通过反射获取媒体URL和类型
                    Dim mediaUrl As String = GetType(SmsRequest).GetProperty($"MediaUrl{i}").GetValue(IncomingMessage).ToString()
                    Dim mediaType As String = GetType(SmsRequest).GetProperty($"MediaContentType{i}").GetValue(IncomingMessage).ToString()

                    ' 下载附件(需Twilio认证)
                    Using client As New HttpClient()
                        ' 添加Basic Auth权限验证
                        Dim authBytes As Byte() = Encoding.ASCII.GetBytes($"{AccountSid}:{AuthToken}")
                        Dim authHeader As String = Convert.ToBase64String(authBytes)
                        client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Basic", authHeader)

                        ' 获取附件字节流,可直接用于邮件转发
                        Dim fileBytes As Byte() = client.GetByteArrayAsync(mediaUrl).Result
                        ' 此处添加邮件转发逻辑,将fileBytes作为附件加入邮件
                    End Using
                Next
                SMSResponse.Message("已收到附件,正在处理...")
                Return TwiML(SMSResponse)
            End If

            ' 原有SMS消息处理逻辑
            If MessageBody IsNot Nothing Then
                If MessageBody.ToUpper.Trim = "JEDI" Then
                    SMSResponse.Message(JediCode)
                ElseIf MessageBody.ToUpper.Trim = "SITH" Then
                    SMSResponse.Message(SithCode)
                Else
                    SMSResponse.Message("Ahsoka? Is that you?")
                End If
            Else
                SMSResponse.Message("What did you want to know?")
            End If

            Return TwiML(SMSResponse)
        End Function
    End Class
End Namespace

关键注意事项

  • 访问权限:Twilio的MediaUrl为受保护资源,必须使用账号SID和Auth Token通过Basic Auth认证才能访问,否则会返回401错误。
  • 属性获取方式:若不想用反射,也可直接从Request.Form中读取参数,如Request.Form("MediaUrl0")。
  • 多附件处理:当NumMedia大于1时,需循环遍历所有MediaUrl{n},逐个处理附件。

内容的提问来源于stack exchange,提问作者G_Hosa_Phat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:20:15