Peter Ayobami
Peter Ayobami

Reputation: 1

Creating Online Meeting Returns: Code: generalException, Message: An error occurred sending the request

I'm trying to create an online meeting from ASP.NET Core Web API, but I'm getting this "generalException" error.

AuthenticationProvider for configuring auth for the API call:

Code:

public class GraphAuthenticationProvider : IAuthenticationProvider
{
    public const string GRAPH_URI = "https://graph.microsoft.com/v1.0/";

    /// <summary>
    /// Default constructor
    /// </summary>
    /// <param name="configuration"></param>
    public GraphAuthenticationProvider(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; set; }

    public async Task AuthenticateRequestAsync(HttpRequestMessage request)
    {
        AuthenticationContext authContext = new AuthenticationContext($"https://login.microsoftonline.com/{Configuration["AzureAd:TenantId"]}");

        ClientCredential credentials = new ClientCredential(Configuration["AzureAd:ClientId"], Configuration["AzureAd:ClientSecret"]);

        AuthenticationResult authResult = await authContext.AcquireTokenAsync(GRAPH_URI, credentials);

        request.Headers.Add("Authorization", "Bearer " + authResult.AccessToken);
        request.Headers.Add("Content-type", "application/json");
    }
}

GraphProvider for making the actual API request:

public class MicrosoftGraphProvider : IGraphProvider
{
    private IGraphServiceClient _graph;

    public MicrosoftGraphProvider(IGraphServiceClient graph)
    {
        _graph = graph;
    }

    public async Task<CreateMeetingResult> CreateMeetingAsync(OnlineMeeting onlineMeeting)
    {
        // Initialize error message
        var errorMessage = default(string);

        // Initialize meeting result
        var meetingResult = default(OnlineMeeting);

        try
        {
            // Try creating the meeting
            meetingResult = await _graph.Me.OnlineMeetings
                .Request()
                .AddAsync(onlineMeeting);
        }
        catch (Exception ex)
        {
            // Set the error message
            errorMessage = ex.Message;
        }

        // Return the result
        return new CreateMeetingResult
        {
            ErrorPhrase = errorMessage,
            MeetingResult = meetingResult
        };
    }
}

AuthenticationProvider, GraphServiceClient, and GraphProvider transient instances in StartUp.cs:

    services.AddTransient<IAuthenticationProvider, GraphAuthenticationProvider>(provider => 
            new GraphAuthenticationProvider(provider.GetService<IConfiguration>()));

    // Add transient instance of the graph service client
    services.AddTransient<IGraphServiceClient, GraphServiceClient>(provider => 
            new GraphServiceClient(provider.GetService<IAuthenticationProvider>()));

    // Add transient instance of the graph provider
    services.AddTransient<IGraphProvider, MicrosoftGraphProvider>(provider => 
            new MicrosoftGraphProvider(provider.GetService<IGraphServiceClient>()));

Setting OnlineMeeting data and invoking CreatingMeeting:

var onlineMeeting = new OnlineMeeting
        {
            Subject = meetingDetails.Subject,
            AllowedPresenters = OnlineMeetingPresenters.Organizer,
            IsEntryExitAnnounced = true,
            Participants = new MeetingParticipants
            {
                Attendees = new List<MeetingParticipantInfo>
                {
                    new MeetingParticipantInfo
                    {
                        Role = OnlineMeetingRole.Attendee,
                        Identity = new IdentitySet
                        {
                            Application = new Identity
                            {
                                Id = Guid.NewGuid().ToString(),
                                DisplayName = "Attendee1"
                            }
                        }
                    },
                    new MeetingParticipantInfo
                    {
                        Role = OnlineMeetingRole.Presenter,
                        Identity = new IdentitySet
                        {
                            Application = new Identity
                            {
                                Id = Guid.NewGuid().ToString(),
                                DisplayName = "Attendee2"
                            }
                        }
                    },
                    new MeetingParticipantInfo
                    {
                        Role = OnlineMeetingRole.Presenter,
                        Identity = new IdentitySet
                        {
                            Application = new Identity
                            {
                                Id = Guid.NewGuid().ToString(),
                                DisplayName = "Attendee3"
                            }
                        }
                    }
                },
                Organizer = new MeetingParticipantInfo
                {
                    Role = OnlineMeetingRole.Presenter,
                    Identity = new IdentitySet
                    {
                        Application = new Identity
                        {
                            Id = Guid.NewGuid().ToString(),
                            DisplayName = Framework.Construction.Configuration["OnlineMeeting:Organiser:DisplayName"]
                        }
                    }
                }
            },
            EndDateTime = DateTimeOffset.Now.AddHours(1),
            StartDateTime = DateTimeOffset.Now.AddHours(2)
        };

// Fire create meeting
var meetingResult = await _graphProvider.CreateMeetingAsync(onlineMeeting);

ApiResponse:

{
    "response": null,
    "successful": false,
    "errorMessage": "Code: generalException\r\nMessage: An error occurred sending the request.\r\n"
}

I have created an application in azure app service and added all necessary permissions as well.

What is it that I'm not doing correctly?

If you require more info, please ask me.

Thanks in advance.

Upvotes: 0

Views: 3097

Answers (1)

unknown
unknown

Reputation: 7483

I'm not sure where the error happened, but there are some problems in your code.

  1. As I said in the comment, the resource should be https://graph.microsoft.com/. https://graph.microsoft.com/v1.0/ is the URL of Microsoft Graph API. Please see this article.

Here are some examples of Microsoft web-hosted resources:

  • Microsoft Graph: https://graph.microsoft.com
  • Microsoft 365 Mail API: https://outlook.office.com
  • Azure Key Vault: https://vault.azure.net
  1. Try to replace Me with Users[<user-id>].

You use ClientCredential to authorize, which means you are using the Client credential flows. The OAuth 2.0 client credentials grant flow permits a web service (confidential client) to use its own credentials, instead of impersonating a user, to authenticate when calling another web service. So you could not call Microsoft Graph API with .Me which is used for the signed-in user.

Upvotes: 0

Related Questions