在C#中授权OneDrive用户会导致程序神秘地崩溃
我正在用.Net核心版本3.1编写一个控制台应用程序。其目的是允许用户访问Microsoft 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
//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()
成功了;非常感谢你^_^