【问题标题】:Having a problem getting Microsoft Graph call to work within a .net web application让 Microsoft Graph 调用在 .net Web 应用程序中工作时遇到问题
【发布时间】:2018-12-05 02:43:09
【问题描述】:

以下代码在控制台应用程序中运行。

public Boolean Graph_IsMemberOfGroup(string Parm_AzureUserID, string Parm_GroupID) {
        Boolean Lcl_ReturnValue = false;
        Task<string> Lcl_Response = GraphPriv_IsMemberOfGroup(Parm_AzureUserID, Parm_GroupID);
        if (Lcl_Response.Result != null) {
            Lcl_ReturnValue = Lcl_Response.Result.Contains(Parm_GroupID);
        }//end if
        return (Lcl_ReturnValue);
    }

    private async Task<string> GraphPriv_IsMemberOfGroup(string Parm_AzureUserID, string Parm_GroupID) {
        string Lcl_Returnvalue = null;
        var Lcl_Uri = "https://graph.windows.net/CleMetroSchools.onmicrosoft.com/users/" + Parm_AzureUserID.Trim() + "/checkMemberGroups?api-version=1.6";
        string Lcl_RequestBody = @"{""groupIds"": [""" + Parm_GroupID.Trim() + @"""]}";
        Global_HttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Global_Token.Result);
        HttpResponseMessage Lcl_PostResult = await Global_HttpClient.PostAsync(Lcl_Uri, new StringContent(Lcl_RequestBody, Encoding.UTF8, "application/json"));
        if (Lcl_PostResult.Content != null) {
            Lcl_Returnvalue = await Lcl_PostResult.Content.ReadAsStringAsync();
        }//end if

        return Lcl_Returnvalue;
    }

我用的电话是

if (Graph_IsMemberOfGroup(CurrentUser,Group)){

我遇到的问题是,当我在普通(非 MVC)ASP.net Web 应用程序中使用相同的代码时。系统在尝试处理 if (Lcl_Response.Result != null) {

之前不会等待 GraphPriv_IsMemberOfGroup 完成

到目前为止我尝试过的任何等待都不会编译或永远等待。 我已经找了好几天了,我所能做的就是深入到混乱的兔子洞里去。

【问题讨论】:

  • 如果完全相同的代码在 ASP.NET 应用程序中工作,那纯属运气。看看Asynchronous programming with async and await
  • 当您调用GraphPriv_IsMemberOfGroup时,您没有使用await...尝试在Task&lt;string&gt; Lcl_Response = await GraphPriv_IsMemberOfGroup(Parm_AzureUserID, Parm_GroupID);上添加await
  • 不过,在使用 async-await 模式之前,您应该遵循 @Stijn 的建议并尝试做更多的研究和培训。
  • 我试过 Task Lcl_Response = await GraphPriv_IsMemberOfGroup(Parm_AzureUserID, Parm_GroupID);但得到编译错误“等待”运算符只能在 asysnc 方法中使用。
  • 我已经阅读并重新阅读了异步和等待,但我仍然不确定该怎么做。请理解,自八月以来我一直在努力解决这个问题。我无法告诉你我花了多少小时观看 youtube 视频和阅读网页试图弄清楚如何做一件事。 (验证用户是否是 AD 组的成员)我阅读的大部分内容要么已经过时,要么只有 sn-ps 代码,而忽略了很多重要部分。

标签: c# asp.net azure-ad-graph-api


【解决方案1】:

您在这里误用了 async/await 模型。您不应该寻找Task&lt;string&gt;,您应该从等待的方法中寻找string

public async Task<Boolean> Graph_IsMemberOfGroup(string Parm_AzureUserID, string Parm_GroupID) {
    Boolean Lcl_ReturnValue = false;
    string Lcl_Response = await GraphPriv_IsMemberOfGroup(Parm_AzureUserID, Parm_GroupID);
    return Lcl_Response.Result.Contains(Parm_GroupID);
}

异步方法返回包装在Task&lt;&gt; 中的值,await 关键字告诉代码等待方法返回并解包响应。因此,如果异步方法返回Task&lt;string&gt;,那么您将使用string s = await method() 调用该方法。

【讨论】:

  • 感谢您的回复。我在使用您提供的代码时遇到的问题是在等待行上给我编译错误,如下所示。错误 CS4032 'await' 运算符只能在异步方法中使用。考虑使用“async”修饰符标记此方法并将其返回类型更改为“Task”。 GraphTest
  • 抱歉,错过了这一点。您需要将Graph_IsMemberOfGroup 转换为异步方法。这启用了 async/await 框架。
  • 如果我把它变成异步,那么同样的整体问题会上升到受保护的 void Button1_Click(object sender, EventArgs e) 我无法进行异步 :( 为了让它等待完成任务。想知道这是否真的在网络应用程序中完成。
  • 您使用什么平台/框架?您应该也可以将事件处理程序设置为异步
  • 谢谢谢谢谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 2023-04-03
  • 2012-05-07
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2021-09-25
相关资源
最近更新 更多