stripe / stripe-dotnet

Stripe.net is a sync/async .NET 4.6.1+ client, and a portable class library for stripe.com.
Apache License 2.0
1.37k stars 570 forks source link

Add ConfigureAwait calls to async calls that are awaited #3002

Closed jar-stripe closed 1 month ago

jar-stripe commented 1 month ago

Why?

A user reported an issue with Stripe.net v46 where it would deadlock when executing a synchronous Get call on one of the services. After investigating, it looks like this call passes through several async calls that are missing ConfigureAsync(false) calls. ConfigureAsync(false) instructs the .NET task to not continue in the context captured when it is created; this is important because if that context is blocked (i.e. because we are synchronously waiting for a response), it will deadlock.

This problem was observed and subsequently reproduced on Windows using .NET Framework, and affects services created without using StripeClient (StripeClient accessed services work as expected).

What?

Verified this fix by running the following in a ASP.NET Framework app, inside the Home page request handler, and confirming that Get does return and the program does proceed:

var svc = new LocationService();
svc.Get("tml_...", null, new Stripe.RequestOptions { ApiKey = "sk_test_..." });