Skip to content

[Issue not fixed] Original link: https://github.com/microsoftgraph/msgraph-sdk-dotnet-core/issues/188 #267

@linzomsft

Description

@linzomsft

Create this ticket to reopen issue as #188

Copy from original description

Describe the bug

https://github.com/microsoftgraph/msgraph-sdk-dotnet-core/blob/eba46355ab864ecea6710e254d3d6938ca2ceadf/src/Microsoft.Graph.Core/Requests/BaseRequest.cs
public async Task SendRequestAsync(
object serializableObject,
CancellationToken cancellationToken,
HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead)
...
// Only call AuthenticateRequestAsync when a custom IHttpProvider is used or our HttpProvider is used without an auth handler.
if (ShouldAuthenticateRequest())
await this.AuthenticateRequestAsync(request);

I believe this section is causing deadlock in my project. The project is on ASP.NET MVC 4. from synchronous controller. In one of the ajax call action implemented. When I write an async await function that wrap the MS Graph related logic and in the caller then i do function().Result or function().GetAwaiter().GetResult() The deadlock happened. It took me quite some time to find out where in the SDK was causing this deadlock. I was able of locate it in this line.
await this.AuthenticateRequestAsync(request);

The API i was using in graphclient.ServicePrincipals[id].Request().GetAsync()
The API i was using in graphclient.ServicePrincipals[id].Request().Owners.GetAsync()

What i did is:

Added my own HttpProvider in GraphServiceCient. The httpprovider i added is actually just a wrap of the HttpProvider from the SDK. I put log statement before the SendRequest(), I notice the log statement never got hit. So i figure the deadlock was before that
I read the BaseRequest.cs and found that line. await this.AuthenticateRequestAsync(request);
So I wonder if this was causing the deadlock because every else in the client i see ConfigureAwait(false) but not that line. So i wrote my own GetAsync() function for graphclient.ServicePrincipals[id].Request().GetAsync()
call it GetAsyncAlpha()
in GetAsyncAlpha() i copied the exact same code and put a log statement before await this.AuthenticateRequestAsync(request);
and after, the log statement never made it after calling await this.AuthenticateRequestAsync(request);
Then i add ConfigureAwait(false) and GetAsyncAlpha() started working. so I am pretty sure it was this line causing the deadlock.
What i ended up doing is, because of this issue. I have to move back to use rest api instead of SDK.


6/25/2021

The issue was fixed at line 203 in method SendMultiPartRequestAsync, but not fixed in method SendRequestAsync, which is the one we are using and having issue.
Is it possible to do sanitize check and add .configureAwait(false) in after all await in the sdk?

AB#10057

Metadata

Metadata

Assignees

Labels

BugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions