2016-08-11 127 views
0

我已經升級到SendGrid API v3,用於我的ASP.Net項目,並發現舊的代碼在IIdentityMessageService.SendAsync函數中發送電子郵件的問題。SendGrid API v3 post breaks示例

我的代碼如下:

Public Class EmailService 
    Implements IIdentityMessageService 

    Public Function SendAsync(message As IdentityMessage) As Task Implements IIdentityMessageService.SendAsync 
     Dim sg = New SendGridAPIClient(ConfigurationManager.AppSettings("SendGridApiKey")) 

     Dim from = New Email("[email protected]", "InvestorsEdge") 
     Dim [to] = New Email(message.Destination) 
     Dim Content = New Content("text/html", message.Body) 
     Dim Mail = New Mail(from, message.Subject, [to], Content) 

     Dim response = sg.client.mail.send.post(requestBody:=Mail.Get()).GetAwaiter().GetResult() 
     If Not response.StatusCode = Net.HttpStatusCode.Accepted Then 
      AtlasDb.Log.ErrorFormat("EmailService.SendAsync", "Abnormal response code ({0}", response.StatusCode) 
     End If 

     Return Task.FromResult(response.StatusCode) 
    End Function 
End Class 

這段代碼在API第2工作正常,但訪問響應對象時,我現在得到一個System.MissingMemberException。

在新的例子中,這個帖子正在等待,但是我可以將SendAsync簽名更改爲Async,因爲它不是我的代碼。 。

回答

0

發現在另一個答案SO張貼here - 郵寄返回的對象現在是一個ConfiguredAwaitable對象 - 的結果可以通過.GetAwaiter()來訪問調用getResult()如下:

Public Class EmailService 
    Implements IIdentityMessageService 

    Public Function SendAsync(message As IdentityMessage) As Task Implements IIdentityMessageService.SendAsync 
     Dim sg = New SendGridAPIClient(ConfigurationManager.AppSettings("SendGridApiKey")) 

     Dim from = New Email("[email protected]", "InvestorsEdge") 
     Dim [to] = New Email(message.Destination) 
     Dim Content = New Content("text/html", message.Body) 
     Dim Mail = New Mail(from, message.Subject, [to], Content) 

     Dim response = sg.client.mail.send.post(requestBody:=Mail.Get()).GetAwaiter().GetResult() 
     If Not response.StatusCode = Net.HttpStatusCode.Accepted Then 
      AtlasDb.Log.ErrorFormat("EmailService.SendAsync", "Abnormal response code ({0}", response.StatusCode) 
     End If 

     Return Task.FromResult(response.StatusCode) 
    End Function 
End Class 

I」 m不知道在普通代碼中這將如何執行關於阻止UI,但認爲這是在ASP.Net中的一個單獨的線程運行,效果不會太糟糕。