我正在使用图形API创建一个Windows窗体应用程序。在应用上,我有更多的形式。另外,我有一个用于登录用户的函数,当用户登录时,他的名字会写在第一个表单上的标签上。在其他表单上,我有一个取消按钮,所以当用户单击取消按钮时,第一个表单会出现,但用户名不会写在标签上。代码如下:
public static class GraphHelper
{
private static string[] scopes = new string[] { "user.read" };
public static string TokenForUser = null;
public static DateTimeOffset expiration;
private const string ClientId = "599ed98d-4356-4a96-ad37-04391e9c48dc";
private const string Tenant = "common";
private const string Authority = "https://login.microsoftonline.com/" + Tenant;
// The MSAL Public client app
private static IPublicClientApplication PublicClientApp;
private static string MSGraphURL = "https://graph.microsoft.com/beta/";
private static AuthenticationResult authResult;
public static GraphServiceClient graphClient;
public static string token;
public static GraphServiceClient GetGraphClient(string token)
{
if (graphClient == null)
{
// Create Microsoft Graph client.
try
{
graphClient = new GraphServiceClient(
"https://graph.microsoft.com/beta",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
// This header has been added to identify our sample in the Microsoft Graph service. If extracting this code for your project please remove.
requestMessage.Headers.Add("SampleID", "uwp-csharp-snippets-sample");
}));
return graphClient;
}
catch (Exception ex)
{
Debug.WriteLine("Could not create a graph client: " + ex.Message);
}
}
return graphClient;
}
public static async Task<string> GetTokenForUserAsync()
{
if (TokenForUser == null || expiration <= DateTimeOffset.UtcNow.AddMinutes(10))
{
PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
.WithAuthority(Authority)
.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
.WithLogging((level, message, containsPii) =>
{
Debug.WriteLine($"MSAL: {level} {message} ");
}, LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true)
.Build();
// It's good practice to not do work on the UI thread, so use ConfigureAwait(false) whenever possible.
IEnumerable<IAccount> accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false);
IAccount firstAccount = accounts.FirstOrDefault();
try
{
authResult = await PublicClientApp.AcquireTokenSilent(scopes, firstAccount)
.ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
// A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
authResult = await PublicClientApp.AcquireTokenInteractive(scopes)
.ExecuteAsync()
.ConfigureAwait(false);
}
TokenForUser = authResult.AccessToken;
}
return TokenForUser;
}
public static async Task<User> GetMeAsync(string token)
{
graphClient = GetGraphClient(token);
try
{
// GET /me
return await graphClient.Me
.Request()
.Select(u => new
{
u.DisplayName
})
.GetAsync();
}
catch (ServiceException ex)
{
return null;
}
}
}
public partial class Form1 : Form
{
public static string token;
public static GraphServiceClient graphClient;
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
token = await GraphHelper.GetTokenForUserAsync();
User graphUser = await GraphHelper.GetMeAsync(token);
label4.Text = graphUser.DisplayName;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
this.Close();
f1.Show();
}
}
有没有人知道当用户单击“取消”按钮时,如何在第一个表单上显示用户名?
在form1
中创建一个公共方法,该方法将调用Graph API并显示用户名。
从Form1.Button1_Click
和Form2.Button2_Click
调用此方法
public partial class Form1 : Form
{
public static string token;
public static GraphServiceClient graphClient;
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
await ShowUserAsync();
}
public async Task ShowUserAsync()
{
token = await GraphHelper.GetTokenForUserAsync();
User graphUser = await GraphHelper.GetMeAsync(token);
label4.Text = graphUser.DisplayName;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private async void button2_Click(object sender, EventArgs e)
{
Form1 f1 = new Form1();
await f1.ShowUserAsync();
this.Close();
f1.Show();
}
}
问题内容: 我收到应用程序异常 每次当我尝试单击DataGridView时。 我收到错误消息 {“索引-1没有值。”}(SystemIndexOutOfaRange异常)。 在行上 而且我无法调试它。请帮助我找出导致此问题的原因以及如何对其进行调试? 问题答案: 我猜想您已经将一个最初为空的List(或其他不生成列表已更改事件的集合)绑定到了您的,然后将项目添加到了此List中。 您添加的项目将正
问题内容: 我想以特定尺寸在Android应用程序中显示图片。我该怎么做?请指导我?还有一件事,我想从SD卡中获得该图像。所以请帮帮我。 提前致谢。 问题答案: 首先,您需要创建一个imageview。 创建布局参数以在布局上添加imageview 然后获取您的图像路径 在ImageView上设置图像 获取您要添加的布局 将视图添加到布局
我正在设置一个新的web应用程序,通过Application Insights登录。我已经安装了AI,并且看到了所有预期的遥测(服务器请求、失败的请求等),但没有通过ILogger发送日志。我已经看过所有类似的问题,我可以找到这样,但没有解决我的问题。 我正在使用。NET 5和2.17版。Microsoft的0(最新版本)。应用程序指示灯。AspNetCore-nuget包。连接字符串和检测键显示
我使用的是JBOSS-7.0,并且希望基于War文件来分离应用程序日志,即我有war1和war2,因此应该基于war1.log和war2.log这样的独立日志文件来生成。现有的日志记录配置是standalone.xml。我读过Jboss给出的这个链接,但是他们给出的配置是在jboss-log4j.xml文件中,而不是standalone.xml日志模块更改。 有人能建议在JBOSS-7.0中为每个
我发现围绕这个主题有很多问题,但没有一个回答我的问题。我有一个聊天应用程序,要求我在收到消息但尚未看到时更改任务栏中的应用程序图标,并在看到所有消息时再次更改它。 在从VS2013开始运行应用程序时,我成功地做到了这一点,使用显示的表单中的以下代码:
是否有写入此事件日志的方法: 或者至少是其他一些Windows默认日志,在那里我不必注册事件源?