Делегат вызова C # Graph API

#c# #asp.net #microsoft-graph-api

#c# #asp.net #microsoft-graph-api

Вопрос:

Вызываю запрос Graph API ME.

Я пытаюсь вызвать вызов делегата, используя c # и консольное приложение. Прямо сейчас это ошибка, которую я получил "Code: generalExceptionrnMessage: An error occurred sending the request.rn"

Это консоль c #, пытающаяся вызвать graph api.

 static void Main(string[] args)
        {
            try
            {
                RunAsync().GetAwaiter().GetResult();
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }

        private static async Task RunAsync()
        {
            string secretKey = <secretKey>;
            string appId = <clientID>;
            string tenantId = <tenantID>;
            string tokenUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/token";
            List<string> scopeURL = new List<string>();
            scopeURL.Add("https://graph.microsoft.com/.default");

            Console.WriteLine("Enter a username");
            string username = Console.ReadLine();
            Console.WriteLine("Enter a password");
            var password = GetConsoleSecurePassword();

            var httpClient = new HttpClient();

            IPublicClientApplication publicClientApplication = PublicClientApplicationBuilder
            .Create(appId)
            .WithTenantId(tenantId)
            .Build();

            UsernamePasswordProvider authProvider = new UsernamePasswordProvider(publicClientApplication, scopeURL);

            GraphServiceClient graphClient = new GraphServiceClient(authProvider);
            try
            {
                User me = await graphClient.Me.Request()
                            .WithUsernamePassword(username, password)
                            .GetAsync();

                var books = await graphClient.BookingBusinesses.Request().GetAsync();
                foreach (var book in books)
                {
                    Console.WriteLine(book.DisplayName);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private static SecureString GetConsoleSecurePassword()
        {
            SecureString pwd = new SecureString();
            while (true)
            {
                ConsoleKeyInfo i = Console.ReadKey(true);
                if (i.Key == ConsoleKey.Enter)
                {
                    break;
                }
                else if (i.Key == ConsoleKey.Backspace)
                {
                    pwd.RemoveAt(pwd.Length - 1);
                    Console.Write("b b");
                }
                else
                {
                    pwd.AppendChar(i.KeyChar);
                    Console.Write("*");
                }
            }
            return pwd;
        }
  

Мне бы очень хотелось иметь возможность вызывать bookingBusiness, однако я даже не могу прочитать своего пользователя.

Это мое разрешение для приложения. Чего мне не хватает? введите описание изображения здесь

Как и просили

 Message: An error occurred sending the request.

 ---> Microsoft.Graph.Auth.AuthenticationException: Code: generalException
Message: Unexpected exception returned from MSAL.

 ---> MSAL.NetCore.4.19.0.0.MsalServiceException:
        ErrorCode: service_not_available
Microsoft.Identity.Client.MsalServiceException: Service is unavailable to process the request
   at Microsoft.Identity.Client.Http.HttpManager.ExecuteWithRetryAsync(Uri endpoint, IDictionary`2 headers, HttpContent body, HttpMethod method, ICoreLogger logger, Boolean doNotThrow, Boolean retry)
   at Microsoft.Identity.Client.Http.HttpManager.ExecuteWithRetryAsync(Uri endpoint, IDictionary`2 headers, HttpContent body, HttpMethod method, ICoreLogger logger, Boolean doNotThrow, Boolean retry)
   at Microsoft.Identity.Client.Http.HttpManager.SendGetAsync(Uri endpoint, IDictionary`2 headers, ICoreLogger logger)
   at Microsoft.Identity.Client.WsTrust.WsTrustWebRequestManager.GetMexDocumentAsync(String federationMetadataUrl, RequestContext requestContext)
   at Microsoft.Identity.Client.WsTrust.CommonNonInteractiveHandler.PerformWsTrustMexExchangeAsync(String federationMetadataUrl, String cloudAudienceUrn, UserAuthType userAuthType, String username, SecureString password)
   at Microsoft.Identity.Client.Internal.Requests.UsernamePasswordRequest.FetchAssertionFromWsTrustAsync()
   at Microsoft.Identity.Client.Internal.Requests.UsernamePasswordRequest.ExecuteAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.Internal.Requests.RequestBase.RunAsync(CancellationToken cancellationToken)
   at Microsoft.Identity.Client.ApiConfig.Executors.PublicClientExecutor.ExecuteAsync(AcquireTokenCommonParameters commonParameters, AcquireTokenByUsernamePasswordParameters usernamePasswordParameters, CancellationToken cancellationToken)
   at Microsoft.Graph.Auth.UsernamePasswordProvider.GetNewAccessTokenAsync(AuthenticationProviderOption msalAuthProviderOption)
        StatusCode: 500
        ResponseBody: <?xml version="1.0" encoding="utf-8" ?><s:Value xmlns:s="http://www.w3.org/2003/05/soap-envelope">s:Receiver</s:Value>
        Headers: Cache-Control: private
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 28 Sep 2020 12:48:52 GMT

   --- End of inner exception stack trace ---
   at Microsoft.Graph.Auth.UsernamePasswordProvider.GetNewAccessTokenAsync(AuthenticationProviderOption msalAuthProviderOption)
   at Microsoft.Graph.Auth.UsernamePasswordProvider.AuthenticateRequestAsync(HttpRequestMessage httpRequestMessage)
   at Microsoft.Graph.AuthenticationHandler.SendAsync(HttpRequestMessage httpRequestMessage, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Microsoft.Graph.HttpProvider.SendRequestAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at Microsoft.Graph.HttpProvider.SendRequestAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at Microsoft.Graph.HttpProvider.SendAsync(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationToken cancellationToken)
   at Microsoft.Graph.BaseRequest.SendRequestAsync(Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Microsoft.Graph.BaseRequest.SendAsync[T](Object serializableObject, CancellationToken cancellationToken, HttpCompletionOption completionOption)
   at Microsoft.Graph.UserRequest.GetAsync(CancellationToken cancellationToken)
   at ConsoleGraph.Program.ClientDelegateApp(String clientId, String tenantId, String secretKey, List`1 scopes) in D:srcConsoleGraphConsoleGraphProgram.cs:line 61
  

Комментарии:

1. привет, я протестировал ваш код, это не проблема, но при неправильном пароле появится та же ошибка, что и у вас, пожалуйста, проверьте это..

2. Проблема здесь в том, что вы не передаете client_secret здесь в конечную точку /token . Если вы не хотите передавать секрет, вам нужно сделать приложение общедоступным клиентом. Вы можете изменить приложение на общедоступный клиент, перейдя в раздел Регистрация приложения —>{ Ваше приложение} -> Аутентификация -> Тип клиента по умолчанию -> Изменить на «да»

3. Дайте мне знать, если это решит вашу проблему :)-

4. Я меняю тип клиента по умолчанию на yes, но я все равно получил исключение null.

5. Можете ли вы поделиться полным ответом на ошибку? По крайней мере, это сработало для конечной точки / me? Попробуйте прокомментировать книги call и forloop и посмотрите. Также проверьте, создали ли вы для него секрет клиента.