Home > Software engineering >  Send mail on session_start
Send mail on session_start

Time:05-30

I want to invoke method (to sending a mail) in session_start. This is my task function:

    Public Shared Async Function SendEmailMessage(ByVal MailFrom As String, ByVal MailTo As String, ByVal Subject As String, ByVal HtmlMessage As String) As Task

    Dim mail As MailMessage = New MailMessage


    mail.From = New MailAddress(MailFrom)

    mail.To.Add(MailTo)

    mail.Subject = Subject

    mail.Body = HtmlMessage

    Dim smtp As SmtpClient = New SmtpClient("smtpclient")
    smtp.Port = 587
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network
    smtp.UseDefaultCredentials = True

    Await Task.Run(Function() smtp.SendMailAsync(mail))

    'Await result

End Function

In global.asax i have this code:

Public Overrides Sub Init()
    MyBase.Init()
    Dim wrapper = New EventHandlerTaskAsyncHelper(AsyncSessionStart)
    Me.AddOnAcquireRequestStateAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler)
End Sub


Private Async Function AsyncSessionStart() As Task
    If Not Session.IsNewSession Then Return
    Await funzioni.SendEmailMessage("***@***.**", "*****@***", "Object text",
                                                    String.Format("E' stato effettuato un tentativo di accesso da {0} del {1} alla WebApp.",
                                                                  Session("name"), Session("office")))
End Function

this is the reference text that I have read and followed asp-net-async-global-asax

visual studio, however, gives me the following error in this part of the code:

Dim wrapper = New EventHandlerTaskAsyncHelper(AsyncSessionStart)

Value of type Task cannot be converted to TaskEventHandler.

where am i wrong?

CodePudding user response:

Without having tested, I believe that this:

Private Async Function AsyncSessionStart() As Task

should be this:

Private Async Sub AsyncSessionStart(sender As Object, e As EventArgs)

The method you specify to the EventHandlerTaskAsyncHelper constructor should be an asynchronous event handler, which means using the standard event handler parameters (which the link you posted does but you ignored) and declaring it an Async Sub.

You also have to use the AddressOf operator to create a delegate in VB. You may also have to specify the delegate type explicitly:

Dim wrapper = New EventHandlerTaskAsyncHelper(AddressOf AsyncSessionStart)

or:

Dim wrapper = New EventHandlerTaskAsyncHelper(New TaskEventHandler(AddressOf AsyncSessionStart))
  • Related