Необработанное исключение. Система.Коллекции.Исключение Generic.KeyNotFoundException: Данный ключ отсутствовал в словаре

#c# #.net #sharepoint

Вопрос:

Я пытаюсь перенести свои коды с .Net 4.7 на .Net core, потому что я думаю, что сейчас это тенденция для приложений sharepoint. Мои коды используют CSOM в .NET 4.7. Но я совершенно новичок в .Net Core и Azure AD. Я зарегистрировал свое приложение в Azure AD и получил свой идентификатор клиента. Теперь я хочу только сначала протестировать, например, получить свои коды для связи с моим сайтом SharePoint. Сейчас я получаю ошибку ниже.

 Unhandled exception. System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.Text.Json.JsonElement.GetProperty(String propertyName)
   at CSOM_core_test.Program.Main(String[] args) in C:Userssourcereposcsom-core-testProgram.cs:line 37
   at CSOM_core_test.Program.<Main>(String[] args)
 

А ниже приведены мои коды:

 using System.Runtime.InteropServices.ComTypes;
using System.Security.Cryptography;
using System.Net;
using System;
using Microsoft.SharePoint.Client;
using System.Web;
using System.Security;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace CSOM_core_test
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string tokenEndpoint = "https://login.microsoftonline.com/common/oauth2/token";
            string resource = "removed";
            var clientId = "clientid";            
            var username = "O365 email";            
            var httpClient = new HttpClient();
            string token = "";

        var pwd = new System.Net.NetworkCredential(string.Empty, GetPwd()).Password;

        var body = $"resource={resource}amp;client_id={clientId}amp;grant_type=passwordamp;username={HttpUtility.UrlEncode(username)}amp;password={HttpUtility.UrlEncode(pwd)}";
        using (var stringContent = new StringContent(body, Encoding.UTF8, "application/x-www-form-urlencoded"))
        {
            var result = await httpClient.PostAsync(tokenEndpoint, stringContent).ContinueWith((response) =>
           {
               return response.Result.Content.ReadAsStringAsync().Resu<
           });

            var tokenResult = JsonSerializer.Deserialize<JsonElement>(result);
            token = tokenResult.GetProperty("access_token").GetString();
        }

        var ctx = new ClientContext(new Uri("https://test.sharepoint.com/"));
        ctx.ExecutingWebRequest  = (sender, e) =>
        {
            e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer "   token;
        };

        ctx.Load(ctx.Web);
        ctx.ExecuteQuery();
        Console.WriteLine(ctx.Web.Title);



    }

    static SecureString GetPwd()
    {
        var pwd = new SecureString();
        foreach (var c in "password")
            pwd.AppendChar(c);

        return pwd;
    }
}
 

}

Результат выглядит следующим образом:

 Result: {
"error":"invalid_grant","error_description":"AADSTS50126: Error validating credentials due to invalid username or password.rnTrace ID: cc136100-1351-4344-8901-0fd3fc022e00rnCorrelation ID: 4e0cc404-643e-47d3-a06d-0c52bcd77e22rnTimestamp: 2021-08-20 22:10:12Z","error_codes":[50126],"timestamp":"2021-08-20 22:10:12Z","trace_id":"cc136100-1351-4344-8901-0fd3fc022e00","correlation_id":"4e0cc404-643e-47d3-a06d-0c52bcd77e22","error_uri":"https://login.microsoftonline.com/error?code=50126"}
 

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

1. Не могли бы вы, пожалуйста, показать пример json, который вы пытаетесь проанализировать?

2. Я не пытаюсь анализировать json. Я беру эту статью в качестве ссылки. helgesmeby.net/2020/06/25/…

3. @QihongKuang Вы анализируете Json здесь var tokenResult = JsonSerializer.Deserialize<JsonElement>(result); . Возможно, вы захотите добавить то, что есть в result вашем вопросе. Это будут данные JSON.

4. @Eric J. Ты прав. Результат выглядит так. Это как показано ниже: Результат: { «ошибка»:»недействительный_грант»,»ошибка описания»:»AADSTS50126: Ошибка проверки учетных данных из-за неверного имени пользователя или пароля. на RnTrace идентификатор: cc136100-1351-4344-8901-0fd3fc022e00РnCorrelation идентификатор: 4e0cc404-643e-47d3-a06d-0c52bcd77e22 наRnTimestamp: 2021-08-20 22:10:12Z с»,»error_codes»:[50126],»метка времени»:»2021-08-20 22:10:12Z»,»trace_id»:»cc136100-1351-4344-8901-0fd3fc022e00″,»correlation_id»:»4e0cc404-643e-47d3-a06d-0c52bcd77e22″,»error_uri»:» login.microsoftonline.com/error?code=50126 «}

5. Вот в чем твоя проблема. Вы пытаетесь получить access_token , но его нет в JSON. Сначала вы должны проверить, есть ли error они.