Skip to main content

Async Task .Result or .Wait() not working in MVC web application

I had a piece of async code that worked as a console application in Visual Studio 2015. I had to move this code into my MVC web application.

In the code, basically you pass an ID to an Api and it returns a document corresponding to that ID. The issue was, there needed to be 2 calls to the Api. As part of the first call you pass the ID and the Api returned a filename. You then pass the filename to the second call and it returns the corresponding document.

This worked fine in a console application. But when I tried to port it into a MVC web application it did not work. Frankly async calls work fine in MVC applications, but in instances like mine, I needed the code to be synchronous, since the second call to the Api should only start after the first call returns valid data. I even tried to make the code synchronous, but this just caused my application to hang at the .Result line (code below)




I tried googling around for a while and finally stumbled upon the following article.
https://blogs.msdn.microsoft.com/jpsanders/2017/08/28/asp-net-do-not-use-task-result-in-main-context/

And reaziled that this is a deadlock issue within ASP.NET. So I updated my code as per the above link



And everything worked in my MVC application. Hooray!
Hope this helps someone else facing a similar situation.

Comments

Popular posts from this blog

Local setup of a SSL certificate

Creating a local ssl certificate is easy. You can do so by creating a self signed certificate in IIS and assigning that to you local site. However you may notice that with newer TLS 1.2 standard, tools like TDS (Team Development for Sitecore) and others stop working and complain about local certificates with errors like Exception: System.Security.Authentication.AuthenticationException Message: The remote certificate is invalid according to the validation procedure. To fix this issue, these were the steps I followed. Hope this helps others that are facing similar issues. 1. Run the following Powershell command to create a local self signed cert (replace xxx.local.com with your local dns): New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName "xxx.local.com" -FriendlyName "xxx.local.com" -NotAfter (Get-Date).AddYears(10) 2. Win Key + search for "Manage computer certificates". Make sure your certificate is in the following 3

Sitecore clear cache setting

Sitecore has extensive cache settings. You can add caching at the rendering level so it affects all instances of that rendering. Or you can add caching at the component level on a particular page via the presentation details. This is all good when you are setting it up, but once this goes to production, the way caching is supposed to work is that the cache should get cleared after an item is published. So after an item is published, any associated cache should also automatically get updated. In our case, we saw that once we went to production (with extensive caching enabled) our pages loaded much faster. However when the content authors were updating content, the updates were not making it to the delivery servers. The content seemed to be stuck in the cache. We noticed that we had to do one of the following to see the updated cache. Go to the admin cache page [SitecoreSite/sitecore/admin/Cache.aspx] and click the "Clear all" button. This is not viable long term solution

Using Okta Authentication for a Sitecore client site

I recently had a project where we had to add a new Sitecore site to an already multi site Sitecore 8.2 Update 7 instance. This new site had to integrate with Okta to manage user authentication. I found many articles online that integrated Okta and Sitecore's admin interface but I could not find one that just integrated Okta with a client Sitecore site. My first step was to use Okta's available ASP.NET MVC projects on their Dev site and test them out. This worked very well with the first Authenticated method I tried which was WS-Fed. But when I tried to use the same authentication method with a site in Sitecore I got errors in my logs like the following: Sitecore.Security.Principal.SitecoreIdentity does not contain a definition for Claims Claims are available in HttpContext.User.Identity but not in Sitecore.Security.Principal.SitecoreIdentity, and since we are using a Sitecore site we could not read the claims. I tried to make claims work in Sitecore using various online a