如何通过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
相关产品推荐
相关产品推荐

