Controller action is getting called twice and IIS logs do not show that
===

I'm having strange behaviour, that can not replicate on local machine and it is starting to drive me nuts.

Looks like ASP.NET MVC is trying to execute action, something timeouts, it fails without any exception and notice to ajax client, then tries to rerun action, ajax client gets response, but not from original call.

I have a controller action:

     [ValidateAntiForgeryToken]
     [ClientErrorHandler]
     public virtual ActionResult PlaceOrder(CheckoutDto checkoutDto)
     {
         LoadDataFromDatabase();

         // this may take up to couple minutes
         var orderConfirmationData = PlaceOrderToExternalWebservice();

         SaveConfirmationData(orderConfirmationData);

         return View(Transform(orderConfirmationData))
     }

And I call it using jquery ajax:

    $.ajax({
                    url: placeOrderActionUrl,
                    type: "POST",
                    async: true,
                    dataType: "html",
                    data: $('#checkoutForm').serialize(),                    
                    success: function (data) {
                       // show confirmation data                       
                    },
                    error: function (request, status, error) {
                       // show error message
                    }
                });

And for small orders it works fine, but for large orders two orders are created and reason seems to be processing time, the larger the order, the more time placing it to external webservice takes.

I've checked IIS logs, to make sure, that client script is not calling action twice - and IIS logs show only one call to particular action.

External service does not fail, there are no exceptions logged in event log/sql log.

To make sure, that ajax client gets response not from original call I've made kind of lock:

     [ValidateAntiForgeryToken]
     [ClientErrorHandler]
     public virtual ActionResult PlaceOrder(CheckoutDto checkoutDto)
     {
         try 
         {
            if (OrderingLockedForCurrentUser()) 
            {
                Log("Locked");
                return View("Already placing order");
            }

            LockOrderingForCurrentUser();

            LoadDataFromDatabase();
            
            // this may take up to couple minutes
            var orderConfirmationData = PlaceOrderToExternalWebservice();

            SaveConfirmationData(orderConfirmationData);

            return View(Transform(orderConfirmationData))
         }
         finally 
         {
            RemoveOrderingLockForCurrentUser();
         }
     }

And instead of returning confirmed data, it returns "already placing order".

Any ideas where to search a reason, what additionally to check, to enable any additional logging?