在C#中授权OneDrive用户会导致程序神秘地崩溃

在C#中授权OneDrive用户会导致程序神秘地崩溃,c#,.net-core,microsoft-graph-api,onedrive,C#,.net Core,Microsoft Graph Api,Onedrive,我正在用.Net核心版本3.1编写一个控制台应用程序。其目的是允许用户访问Microsoft OneDrive帐户,并根据需要修改这些帐户。事实证明,要通过授权阶段是很困难的。下面是一段代码片段,演示了我的工作: //using statements namespace HelloOneDrive { public class Program { static void Main(string[] args) { Task

我正在用.Net核心版本3.1编写一个控制台应用程序。其目的是允许用户访问Microsoft OneDrive帐户,并根据需要修改这些帐户。事实证明,要通过授权阶段是很困难的。下面是一段代码片段,演示了我的工作:

//using statements
namespace HelloOneDrive
{
    public class Program
    {
        static void Main(string[] args)
        {
            Task handleThing = (new Thing()).Handle();
        }
    }

    public class Thing
    {
        public async Task Handle()
        {
            ClientCredentialProvider credentials;
            string tenantId = //value
            string clientId = //value
            string clientSecret = //value
            AuthenticationResult authResult;
            string[] scopes = { "https://graph.microsoft.com/.default" };
            CancellationToken cancellationToken = new CancellationToken();
            GraphServiceClient client = null;

            try
            {
                credentials = new ClientCredentialProvider(ConfidentialClientApplicationBuilder
                    .Create(clientId)
                    .WithTenantId(tenantId)
                    .WithClientSecret(clientSecret)
                    .Build());
            }
            catch (Exception ex)
            {
                //[logic for handling an exception, that never gets thrown]
            }

            try
            {
                authResult = await credentials
                .ClientApplication
                .AcquireTokenForClient(scopes)
                .ExecuteAsync(cancellationToken);
            }
            catch (Exception ex)
            {
                //[logic for handling an exception, that never gets thrown]
                //The program fails silently and suddenly, rather than hit
                //this catch block.
                Console.WriteLine("hello");
            }

            if (authResult != null)
            {
                client = new GraphServiceClient(
                    new DelegateAuthenticationProvider(
                        requestMessage =>
                        {
                            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
                            return Task.FromResult(0);
                        }));
            }

            if (client != null)
            {
                ...
调试器将进入第二个
try-catch
块,尝试定义
authResult
,然后突然结束。没有例外;节目刚刚结束

如果有用,我使用的NuGet软件包包括:

  • Microsoft.Graph v3.21.0
  • Microsoft.Graph.Auth v1.0.0-preview.6
  • Microsoft.Graph.Core v1.23.0(v2.0.0-preview.4)
  • Microsoft.Identity.Client v4.24.0

帮助?

您正在从非异步
Main
调用
async
方法,而不是等待结果。因此,您的
Handle()
方法将同步执行,直到到达第一个异步调用。(
authResult=await credentials…
)然后同步执行流被返回给
Main
方法,该方法没有其他事情可做,因此它退出。如果
Main
方法结束,整个过程当然会结束,因为运行时不会等待正在运行的任务完成,除非您明确告诉它这样做

例如,您可以在
Main
方法中对任务执行
Wait()

static void Main(string[] args)
{
  Task handleThing = (new Thing()).Handle();
  handleThing.Wait();
}
或者您也可以使您的
Main
异步,然后
wait
您的
Handle()
任务

static async Task Main(string[] args)
{
  await (new Thing()).Handle();
}

您正在从非异步
Main
调用
async
方法,而不是等待结果。因此,您的
Handle()
方法将同步执行,直到到达第一个异步调用。(
authResult=await credentials…
)然后同步执行流被返回给
Main
方法,该方法没有其他事情可做,因此它退出。如果
Main
方法结束,整个过程当然会结束,因为运行时不会等待正在运行的任务完成,除非您明确告诉它这样做

例如,您可以在
Main
方法中对任务执行
Wait()

static void Main(string[] args)
{
  Task handleThing = (new Thing()).Handle();
  handleThing.Wait();
}
或者您也可以使您的
Main
异步,然后
wait
您的
Handle()
任务

static async Task Main(string[] args)
{
  await (new Thing()).Handle();
}

您如何知道没有抛出异常?您的代码捕获异常,然后将其丢弃。你不会看到任何东西,除非你在捕捉区内做些什么。抑制有效异常是一种反模式;然而,为了简洁起见,我没有包含逻辑,就像我没有使用语句包含我的
,或者一些变量的值一样。我知道代码不会捕获任何异常,因为我已经逐行运行调试程序好几次了,并且亲眼目睹了发生的情况^_^您能否编辑代码示例,以便更清楚地了解您在处理异常时所做的工作?现在,您的评论似乎在提醒自己实现异常处理。Ok。从你的样品中真的一点也不清楚。你会感到惊讶的是,有多少人使用一个空捕获只是为了躲避一个异常,而当他们无法诊断错误时,它又回来咬他们。总之,当代码神秘结束时,异常日志中没有任何内容?如果(authResult!=null)
行,它永远不会到达
行。NET程序通常不会随机停止。主windows事件日志中可能有任何内容吗?我的异常日志中没有任何内容,并且它永远不会到达
if
块<代码>程序“[30860]HelloOneDrive.exe”已退出,代码为0(0x0)。
是调试器输出的唯一有价值的东西,它只确认程序只是出于某种原因结束。您如何知道没有引发异常?您的代码捕获异常,然后将其丢弃。你不会看到任何东西,除非你在捕捉区内做些什么。抑制有效异常是一种反模式;然而,为了简洁起见,我没有包含逻辑,就像我没有使用语句包含我的
,或者一些变量的值一样。我知道代码不会捕获任何异常,因为我已经逐行运行调试程序好几次了,并且亲眼目睹了发生的情况^_^您能否编辑代码示例,以便更清楚地了解您在处理异常时所做的工作?现在,您的评论似乎在提醒自己实现异常处理。Ok。从你的样品中真的一点也不清楚。你会感到惊讶的是,有多少人使用一个空捕获只是为了躲避一个异常,而当他们无法诊断错误时,它又回来咬他们。总之,当代码神秘结束时,异常日志中没有任何内容?如果(authResult!=null)
行,它永远不会到达
行。NET程序通常不会随机停止。主windows事件日志中可能有任何内容吗?我的异常日志中没有任何内容,并且它永远不会到达
if
块<代码>程序“[30860]HelloOneDrive.exe”已退出,代码为0(0x0)。
是调试器输出的唯一有价值的东西,调试器只确认程序只是出于某种原因而结束。
handleThing.Wait()
完成了该操作;非常感谢你^_^
handleThing.Wait()
成功了;非常感谢你^_^