Microsoft graph api 从其他应用程序调用DLL中的图形API时失败

Microsoft graph api 从其他应用程序调用DLL中的图形API时失败,microsoft-graph-api,Microsoft Graph Api,我已经编写了一个应用程序,使用Quickstart中的示例代码调用Microsoft Graph API。(在github中:)我修改了代码,使其成为一个类库,用于读取、添加和删除Outlook日历中的事件。我在解决方案中添加了一个简单的基于表单的应用程序来测试该应用程序。非常成功 下一步是修改现有应用程序以使用此新DLL。所有Microsoft图形设置(ClientId、ClientSecret和Tenant…)都是在测试DLL时引入的 当我运行此代码试图检索日历事件列表时,获取访问令牌的调用

我已经编写了一个应用程序,使用Quickstart中的示例代码调用Microsoft Graph API。(在github中:)我修改了代码,使其成为一个类库,用于读取、添加和删除Outlook日历中的事件。我在解决方案中添加了一个简单的基于表单的应用程序来测试该应用程序。非常成功

下一步是修改现有应用程序以使用此新DLL。所有Microsoft图形设置(ClientId、ClientSecret和Tenant…)都是在测试DLL时引入的

当我运行此代码试图检索日历事件列表时,获取访问令牌的调用失败/崩溃。我没有发现异常,代码只是存在。以下是一些相关的片段

从VB.net代码调用

Try
     eventArray = Await CalendarG.getCalendarEventsAsync(mailBoxEmail, DateTime.Today.AddMonths(6).AddDays(-7).ToString, DateTime.Today.AddMonths(7).AddDays(-7).ToString)
Catch ex As Exception
     Debug.Print(ex.Message)
End Try
C#DLL代码

public异步静态任务getCalendarEventsSync(字符串calendarEmail、字符串startDate、字符串endDate)
{
AuthenticationConfig=AuthenticationConfig.ReadFromJsonFile(“appsettings.json”);
IConfidentialClientApplicationApp=SecretentialClientApplicationBuilder.Create(config.ClientId)
.WithClientSecret(config.ClientSecret)
.WithAuthority(新Uri(配置权限))
.Build();
string[]scopes=新字符串[]{$“{config.ApiUrl}.default};
字符串dtStart=DateTime.Parse(startDate.ToString(“O”);
字符串dtEnd=DateTime.Parse(endDate.ToString(“O”);
AuthenticationResult=null;
尝试
{
结果=等待app.AcquireTokenForClient(scopes.ExecuteAsync();
}
catch(MsalServiceException ex)//当(ex.Message.Contains(“AADSTS70011”))
{
抛出新异常($“范围请求被拒绝。{ex.Message}”);
}
catch(异常ex1)//不是MsalServiceException
{
抛出新异常($“其他令牌异常:{ex1.Message}”);
}
当单步执行代码时,代码从调用进入CalendarG.getCalendarEventsAsync行,向下执行代码以获取客户端令牌。此时它不会引发异常,而是跳回VB.net中的调用。该行代码也不会引发异常。事实上,控制台显示调用应用程序和以前的线程都已退出,代码为0。有一个ObjectDisposeException抛出到未捕获的最末端的即时窗口


有人能给我指出一个合适的方向吗?为什么对客户端令牌的调用没有引发异常?

以下是我使用的Vb.net代码

公共部分类主窗口
继承窗口
私有图形点作为字符串=”https://graph.microsoft.com/v1.0/me"
私有作用域为String()=新String(){“user.read”}
公共分新()
初始化组件()
端接头
专用异步子调用GraphButton_单击(ByVal sender作为对象,ByVal e作为RoutedEventArgs)
Dim authResult As AuthenticationResult=无
Dim app=app.PublicClientApp
ResultText.Text=String.Empty
TokenInfoText.Text=String.Empty
Dim accounts=wait app.GetAccountsAsync()
Dim firstAccount=accounts.FirstOrDefault()
尝试
authResult=wait app.AcquireTokenSilent(作用域,firstAccount).ExecuteAsync()
作为要求例外的捕获物
System.Diagnostics.Debug.WriteLine($“MsalUiRequiredException:{ex.Message}”)
尝试
authResult=Wait app.AcquireTokenInteractive(作用域)。WithAccount(accounts.FirstOrDefault())。WithPrompt(Prompt.SelectAccount)。ExecuteAsync()
将msalex捕获为MsalException
ResultText.Text=$“获取令牌时出错:{System.Environment.NewLine}{msalex}”
结束尝试
特例
ResultText.Text=$“以静默方式获取令牌时出错:{System.Environment.NewLine}{ex}”
返回
结束尝试
如果authResult不是空的,那么
ResultText.Text=等待GetHttpContentWithToken(graphAPIEndpoint,authResult.AccessToken)
DisplayBasicTokenInfo(authResult)
Me.signburatton.Visibility=可见性.Visibility
如果结束
端接头

End Class
如果您不熟悉异步/等待方法,那么您应该阅读

然后你应该再读一遍

相关路线是: 该方法通常至少包含一个wait表达式,该表达式标记了在等待的异步操作完成之前该方法无法继续的点。同时,该方法被挂起,控件返回给该方法的调用方

因此,当执行到达第一个WAIT语句时,它会返回给调用方,但不会返回JArray。正确的实现应该有一个任务处理程序,在异步方法完成时可以接收JArray信息。

让我添加我在结束时使用的VB.Net代码(见下文)。测试它,看看它是否有用。
public async static Task<JArray> getCalendarEventsAsync(string calendarEmail, String startDate, String endDate)
{
    AuthenticationConfig config = AuthenticationConfig.ReadFromJsonFile("appsettings.json");
    IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
            .WithClientSecret(config.ClientSecret)
            .WithAuthority(new Uri(config.Authority))
            .Build();

     string[] scopes = new string[] { $"{config.ApiUrl}.default" };

     string dtStart = DateTime.Parse(startDate).ToString("O");
     string dtEnd = DateTime.Parse(endDate).ToString("O");

     AuthenticationResult result = null;
     try
       {
           result = await app.AcquireTokenForClient(scopes).ExecuteAsync();                
       }
     catch (MsalServiceException ex) // when (ex.Message.Contains("AADSTS70011"))
       {
          throw new Exception($"Scope request rejected.  {ex.Message}");
       }
     catch (Exception ex1)  // not a MsalServiceException
       {
          throw new Exception($"Other token exception: {ex1.Message}");
       }