簡體   English   中英

通過 ASP.NET MVC controller 從 MMS 檢索文件附件

[英]Retrieve file attachment from MMS via ASP.NET MVC controller

我正在嘗試使用 Twilio 服務通過 SMS/MMS 與個人進行交互。 我已經想出了如何發送彩信來啟動“對話”,這似乎運作良好。 但是,現在我正在嘗試構建一個系統來響應我啟用了 SMS/MMS 的測試號碼上的傳入消息。 我正在使用在 Twilio 文檔站點上找到的示例之一來構建 ASP.NET MVC web 服務來處理對話(VB.NET):

Imports System.Web.Mvc
Imports Twilio.AspNet.Common
Imports Twilio.AspNet.Mvc
Imports Twilio.TwiML

Namespace Controllers
    Public Class SMSController
        Inherits TwilioController

        ' GET: SMS
        Function Index(ByVal IncomingSMS As SmsRequest) As TwiMLResult
            Dim SMSResponse As New MessagingResponse
            Dim SMSMessage As String = IncomingSMS.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."

            If SMSMessage IsNot Nothing Then
                If SMSMessage.ToUpper.Trim = "JEDI" Then
                    SMSResponse.Message(JediCode)
                ElseIf SMSMessage.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

是的,這只是我用於測試的“玩”東西,最終會被更適合目的的東西所取代,但我想在深入了解事物的現實之前嘗試弄清楚這一切.

我已經在我的 IIS 服務器上設置了站點,注冊了 DNS,甚至還設置了我的 SSL 證書。 到目前為止,我的簡單測試似乎一切都很好,但是到目前為止我仍然無法弄清楚一些事情,我希望這里有人可以為我指明正確的方向。

我將分別問每個問題,但這是第一個問題:如何從彩信中檢索附件?

我希望能夠接收 PDF(可能還有其他文件類型)並通過 email 將它們傳遞給適當的個人或部門。 我知道如何發送電子郵件,但我無法找到適當的文檔來說明如何檢索 MMS 消息中的附件以將其實際包含在 email 進程中。

當我嘗試訪問IncomingSMS ( SmsRequest ) object 的屬性時,我在其中沒有找到對Media任何引用 - 沒有NumMedia ,沒有MediaUri ,什么都沒有。 似乎沒有MmsRequest object 類型(無論如何我已經找到了)。

為了能夠檢索我發送到我的測試編號以進行進一步處理的 PDF,我在這里忽略了什么? 我應該更改方法的定義以接受 object 作為MessageResource還是什么?

編輯:我忘了提到我檢查了 Twilio 控制台並看到顯然已成功收到帶有附件的消息,所以我知道至少該部分工作正常。

我已經問了第二個相關的問題,它與這個問題一起幫助“完成”我們的目標的一些事情。

The SmsRequest class that you're using comes from the Twilio helper library for ASP.NET which aims to make it easier to integrate Twilio into ASP.NET. 但是, SmsRequest和其他類並未涵蓋所有可能的 webhook 參數。 如果 class 中缺少參數,您仍然可以手動檢索參數,而不是依賴 MVC Model 綁定。

基於這個C# 示例,我創建了一個 VB.NET 示例來展示如何接收和保存傳入的彩信文件:

Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks
Imports MimeTypes
Imports Twilio.AspNet.Mvc
Imports Twilio.TwiML
Imports Twilio.TwiML.Messaging

Public Class HomeController
    Inherits TwilioController

    Shared httpClient As HttpClient = New HttpClient

    Async Function Index() As Task(Of TwiMLResult)
        Dim response As New MessagingResponse
        Dim message As New Message

        Dim numMedia = Short.Parse(If(Request.Form.Get("NumMedia"), 0))
        If numMedia = 0 Then
            response.Message("No file received.")
            Return TwiML(response)
        End If

        For mediaIndex As Integer = 0 To numMedia
            Dim mediaUrl = Request.Form.Get($"MediaUrl{mediaIndex}")
            Dim contentType = Request.Form.Get($"MediaContentType{mediaIndex}")
            Dim saveFilePath = Server.MapPath(String.Format(
                "~/App_Data/{0}{1}",
                Path.GetFileName(mediaUrl),
                MimeTypeMap.GetExtension(ContentType)
            ))
            Await DownloadUrlToFileAsync(mediaUrl, saveFilePath)
        Next

        response.Message("File received.")
        Return TwiML(response)
    End Function

    Private Async Function DownloadUrlToFileAsync(mediaUrl As String, saveFilePath As String) As Task
        Dim Response = Await httpClient.GetAsync(mediaUrl)
        Dim httpStream = Await Response.Content.ReadAsStreamAsync()
        Using fileStream As Stream = IO.File.Create(saveFilePath)
            Await httpStream.CopyToAsync(fileStream)
            Await fileStream.FlushAsync()
        End Using
    End Function


End Class

您可以通過假設只有一個文件將通過 MMS 發送來稍微簡化代碼,但處理其他情況也是一個好主意。

為了獲得正確的文件擴展名,我使用了這個MimeTypeMap library ,但您可以推出自己的解決方案。

默認情況下,來自傳入 MMS 的文件通過MediaUrl{mediaIndex} URL 公開可用,但最好為這些媒體文件打開基本身份驗證

如果您為媒體文件打開基本身份驗證,則需要將身份驗證 header 添加到 HTTP 請求中,如下所示:

Imports System.IO
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Threading.Tasks
Imports MimeTypes
Imports Twilio.AspNet.Mvc
Imports Twilio.TwiML
Imports Twilio.TwiML.Messaging

Public Class HomeController
    Inherits TwilioController

    Shared httpClient As HttpClient = CreateHttpClient()
    Private Shared Function CreateHttpClient() As HttpClient
        Dim client As New HttpClient
        Dim appSettings As NameValueCollection = ConfigurationManager.AppSettings
        If Boolean.Parse(If(appSettings.Get("TwilioUseBasicAuthForMedia"), False)) Then
            Dim authString = $"{appSettings.Get("TwilioAccountSid")}:{appSettings.Get("TwilioAuthToken")}"
            authString = Convert.ToBase64String(Encoding.ASCII.GetBytes(authString))
            client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Basic", authString)
        End If

        Return client
    End Function

    ...

End Class

我正在從Web.config appSettings 中檢索TwilioUseBasicAuthForMediaTwilioAccountSidTwilioAuthToken

(確保您沒有將這些機密檢查到源代碼控制中,而是使用 UserSecretsConfigBuilder來安全地設置機密)。

這是GitHub 上的源代碼


歡迎您提交 GitHub 問題和/或 PR,以向SmsRequest添加對這些缺失參數的支持。 但是,它不會像普通的 model 綁定那樣簡單,因為參數數量會隨着通過 MMS 發送的文件數量增加而增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM