Skip to main content

What to do when I receive 502 error code on an Azure endpoint - HTTP Request failed. Error Code: 502.

From time to time we started to receive from Azure Web 502 HTTP error code during some load tests. In this post we will talk a little about what can be the root cause of this error and how we can manage it.
HTTP client exception: HTTP Request failed. Error Code: 502.
This error does not appears very often, but can be annoying. Especially because the root cause of this error cannot be traced easily.
When you have an Azure WebApp (Azure WebSite) or an Azure Web Role this error is not returned by your application. This error is returned in most cases by Azure Load Balancer that plays the role of ARR (Application Request Routing).
When ARR doesn't receive a response from your application in 3 minutes (default timeout for Azure WebApp), a 502 error is returned. For ARR this means that the system is not in a good health, it could be even in a Pending state. The 3 minutes timeout period is specific for Azure Web App (Azure Web Sites)
First think that you need to do is to look into your system and try to identify what part of the system is so slow or what trigger a crash into your system.

The second question that you should ask yourself is if is normal and acceptable from your side to have a request that takes more than 3 minutes.

  • If no, than you should try to see how you can optimize your system to reduce the timeout.
  • If yes, than you need to change the configuration of Azure Load Balancer.

How to change the default idle timeout
This configuration can be made at TCP level, changing the TCP timeout. In this moment this configuration is supported for VMs, Web Roles, Worker Roles and NOT for Azure Web Apps (Azure Web Sites). The maximum value that is acceptable is 30 minutes.
Based on your needs you can increase or decrease this value. Before doing this, at the first release of your system you should identify what is the best value for your system, based on your business use cases and client requirements.

Settings this value cannot be made directly in the portal. This configuration can be made from Powershell or .csdef file. For more information related to how you can configure it -

An useful PowerShell command is Get-AzureEndpoint. This will retrieve all the configuration of the endpoint, including "IdleTimeoutInMinutes".
Get-AzureVM –ServiceName “FooService” –Name “FooVM” | Get-AzureEndpoint

The takeaways of this post are:

  • 502 is caused in general by a timeout
  • The timeout can be configured at endpoint level
  • The timeout cannot be configured 


Popular posts from this blog

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

GET call of REST API that contains '/'-slash character in the value of a parameter

Let’s assume that we have the following scenario: I have a public HTTP endpoint and I need to post some content using GET command. One of the parameters contains special characters like “\” and “/”. If the endpoint is an ApiController than you may have problems if you encode the parameter using the http encoder.
using (var httpClient = new HttpClient()) { httpClient.BaseAddress = baseUrl; Task<HttpResponseMessage> response = httpClient.GetAsync(string.Format("api/foo/{0}", "qwert/qwerqwer"))); response.Wait(); response.Result.EnsureSuccessStatusCode(); } One possible solution would be to encode the query parameter using UrlTokenEncode method of HttpServerUtility class and GetBytes method ofUTF8. In this way you would get the array of bytes of the parameter and encode them as a url token.
The following code show to you how you could write the encode and decode methods.

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…