This week, while I was implementing a BizTalk Server monitoring solution using:
- PowerShell: for querying the environment.
- Logic Apps: creating the flow logic for notifying of non-compliances.
- Function App: to convert the JSON object to HTML.
while I was trying to invoke a Logic App with a Request trigger from PowerShell:
{
$jsonDoc = [pscustomobject]@{
Monitor = "Disk Space Monitoring"
Client = "Sandro Pereira"
Environment = "DEV"
Disks = $diskNode
}
Invoke-WebRequest -Uri 'https://{URi}.logic.azure.com:443/workflows/{guid}/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig={sig}' -Method POST -Body ($jsonDoc|ConvertTo-Json) -ContentType "application/json"
}
I got the following error:
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
At C:\BizTalkApplications\Monitor\Monitor_BizTalk_DiskSpaceStorage_with_Flow.ps1:77 char:1
+ Invoke-WebRequest -Uri ‘https://{URI}.logic.azure.com:44 …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

📝 One-Minute Brief
Explains how to fix the PowerShell error when calling a Logic App with the message “The underlying connection was closed: An unexpected error occurred on a send”, caused by TLS protocol incompatibility, and shows how to enforce TLS 1.2.
Cause
I had already experienced something similar when communicating with Logic Apps from the BizTalk Server Logic App adapter. However, I had already forgotten about it.
But in fact, the essence of this error and the one I got with the BizTalk adapter is the same.
The Logic App Request trigger supports only Transport Layer Security (TLS) 1.2 for incoming calls. Outgoing calls continue to support TLS 1.0, 1.1, and 1.2.
Solution
The solution was, and is, very simple; we just need to enforce PowerShell to use TLS 1.2. This can be done using this PowerShell one-line:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

{
$jsonDoc = [pscustomobject]@{
Monitor = "Disk Space Monitoring"
Client = "Sandro Pereira"
Environment = "DEV"
Disks = $diskNode
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -Uri 'https://{URi}.logic.azure.com:443/workflows/{guid}/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig={sig}' -Method POST -Body ($jsonDoc|ConvertTo-Json) -ContentType "application/json"
}
Hope you find this helpful! If you liked the content or found it useful and would like to support me in writing more, consider buying (or helping to buy) a Star Wars Lego set for my son.