As part of my “day job” I spend a bit of time working with VB.Net 4.X “legacy” projects doing upgrades, and bug fixes. Currently I am updating a number of Windows Service applications to run as Microsoft Azure Functions. With the release of the Azure functions runtime V4 Isolated Worker Processes with .NET Framework V4.8 support this is the last post in my Azure Functions with VB.Net 4.X and Azure Functions with VB.Net on .NET Core V6 series.
I have published source code for Azure Storage BlobTrigger, Azure Storage QueueTrigger, and TimerTriggers.
All of the examples now have a program.vb which initialises the Trigger.
Namespace VBNet....TriggerIsolated
Friend Class Program
Public Shared Sub Main(ByVal args As String())
Call FunctionsDebugger.Enable()
Dim host = New HostBuilder().ConfigureFunctionsWorkerDefaults().Build()
host.Run()
End Sub
End Class
End Namespace
All of the Isolated worker process Triggers displayed this message which appeared to be benign.
Csproj not found in C:\Users\..\VBNetHttpTriggerIsolated\bin\Debug\net48 directory tree. Skipping user secrets file configuration.
There were a lot of articles about problems building Docker images but the only relevant ones appeared to talk about getting F# and other .NET Core languages to work in Azure Functions.
Namespace devMobile.Azure.VBNetBlobTriggerIsolated
Public Class BlobTrigger
Private ReadOnly _logger As ILogger
Public Sub New(ByVal loggerFactory As ILoggerFactory)
_logger = loggerFactory.CreateLogger(Of BlobTrigger)()
End Sub
<[Function]("vbnetblobtriggerisolated")>
Public Sub Run(
<BlobTrigger("vbnetblobtriggerisolated/{name}", Connection:="blobendpoint")> ByVal myBlob As String, ByVal name As String)
_logger.LogInformation($"VB.Net NET 4.8 Isolated Blob trigger function Processed blob Name: {name} Data: {myBlob}")
End Sub
End Class
End Namespace
I used Azure Storage Explorer to upload files containing Lorem Ipsum for testing the BlobTrigger.
I used Telerik Fiddler to POST messages to the desktop emulator and Azure endpoints.
Namespace VBNetHttpTriggerIsolated
Public Class HttpTrigger
Private Shared executionCount As Int32
Private ReadOnly _logger As ILogger
Public Sub New(ByVal loggerFactory As ILoggerFactory)
_logger = loggerFactory.CreateLogger(Of HttpTrigger)()
End Sub
<[Function]("Notifications")>
Public Function Run(
<HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")> ByVal req As HttpRequestData) As HttpResponseData
Interlocked.Increment(executionCount)
_logger.LogInformation("VB.Net NET 4.8 Isolated HTTP trigger Execution count:{executionCount} Method:{req.Method}", executionCount, req.Method)
Dim response = req.CreateResponse(HttpStatusCode.OK)
response.Headers.Add("Content-Type", "text/plain; charset=utf-8")
Return response
End Function
End Class
End Namespace
I used Azure Storage Explorer to create messages for testing the QueueTrigger
Namespace devMobile.Azure.VBNetQueueTriggerIsolated
Public Class QueueTrigger
Private Shared _logger As ILogger
Private Shared _concurrencyCount As Integer = 0
Private Shared _executionCount As Integer = 0
Public Sub New(ByVal loggerFactory As ILoggerFactory)
_logger = loggerFactory.CreateLogger(Of QueueTrigger)()
End Sub
<[Function]("VBNetQueueTriggerIsolated")>
Public Sub Run(
<QueueTrigger("vbnetqueuetriggerisolated", Connection:="QueueEndpoint")> ByVal message As String)
Interlocked.Increment(_concurrencyCount)
Interlocked.Increment(_executionCount)
_logger.LogInformation("VB.Net .NET 4.8 Isolated Queue Trigger Concurrency:{_concurrencyCount} ExecutionCount:{_executionCount} Message:{message}", _concurrencyCount, _executionCount, message)
Interlocked.Decrement(_concurrencyCount)
End Sub
End Class
End Namespace
Namespace devMobile.Azure.VBNetTimerTriggerIsolated
Public Class TimerTrigger
Private Shared _logger As ILogger
Private Shared _executionCount As Integer = 0
Public Sub New(ByVal loggerFactory As ILoggerFactory)
_logger = loggerFactory.CreateLogger(Of TimerTrigger)()
End Sub
<[Function]("Timer")>
Public Sub Run(
<TimerTrigger("0 */1 * * * *")> ByVal myTimer As MyInfo)
Interlocked.Increment(_executionCount)
_logger.LogInformation("VB.Net Isolated TimerTrigger next trigger:{0} Execution count:{1}", myTimer.ScheduleStatus.Next, _executionCount)
End Sub
End Class
The development, debugging and deployment of these functions took a lot of time. Initially Azure Application Insights didn’t work when the Azure Isolated Worker triggers were deployed to Azure. After some experimentation I found that Application Insights Connection Strings worked and Application Instrumentation Keys did not.
With the Microsoft: ‘We Do Not Plan to Evolve Visual Basic as a Language this should hopefully be my last post about VB.Net ever.



































