【问题标题】:Xamarin.Forms OAuth Token authenticationXamarin.Forms OAuth 令牌身份验证
【发布时间】:2019-08-08 08:03:08
【问题描述】:

我试着按照你的建议去做(在下面回答)。不幸的是我仍然有这个问题。 这是我的新 TokenService.cs: 类令牌服务

{
    TokenKeeper tokenkeeper;

    public TokenService()
    {
        tokenkeeper = new TokenKeeper();
    }

    public async void AwaitGetToken()
    {
        tokenkeeper = new TokenKeeper();
        tokenkeeper = await GetToken();          
    }

    private async Task<TokenKeeper> GetToken()
    {
        string stringuri = string.Format("{0}/token", RestAccess.HostUrl);

        var dict = new Dictionary<string, string>();
        dict.Add("grant_type", "password");
        dict.Add("username", RestAccess.User);
        dict.Add("password", RestAccess.Pass);
        dict.Add("client_id", RestAccess.Client_ID);
        dict.Add("client_secret", RestAccess.Client_secret);

        tokenkeeper=new TokenKeeper();
        var httpclient = new HttpClient();
        try
        {
            var req = new HttpRequestMessage(HttpMethod.Post, stringuri) { Content = new FormUrlEncodedContent(dict) };
            var res = await httpclient.SendAsync(req);
            if (res.IsSuccessStatusCode)
            {
                var content = await res.Content.ReadAsStringAsync();
                tokenkeeper = JsonConvert.DeserializeObject<TokenKeeper>(content);
                return tokenkeeper;
            }

            return tokenkeeper;
        }
        catch
        {
            return tokenkeeper;
        }
        finally
        {
            httpclient.CancelPendingRequests();
            httpclient.Dispose();   
        }
    }
}

我的 tokenkeeper 是简单的类:

public class TokenKeeper
    {
        public string access_token { get; set; }
        public string refresh_token { get; set; }
        public TokenKeeper()
        {
            access_token = "";
            refresh_token = "";
        }
    }

在我的调用代码中,我的代码如下:

...
tokenservice.AwaitGetToken();  
GetXFMapUserFromAzureAndSetVariable(RestAccess.User);  
_navigationService.NavigateAsync("ZleceniaListContentPage", par);
...

tokenservice.AwaitGetToken() 和 GEtXFMapUserFromAzureAndSetVariable(RestAccess.User) 它们是相似的。两者都在等待,但 tokenservice.AwaitGetToken() 是 POST,而 GEtXFMapUserFromAzureAndSetVariable 是 GET。 GEtXFMapUserFromAzureAndSetVariable 工作正常,但如果我调用 tokenservice.AwaitGetToken() 应用程序会在继续之前获取令牌。最后,指令 GEtXFMapUserFromAzureAndSetVariable 正在完成 tokenservice.AwaitGetToken() 响应。

我如何才能等待调用 GEtXFMapUserFromAzureAndSetVariable 直到收到来自 tokenservice.AwaitGetToken() 的回复???

【问题讨论】:

  • 查看方法定义GetTokenPublic n TokenService 类,我假设你没有等待令牌获取,等待它直到你得到响应。

标签: c# xamarin.forms token httpclient


【解决方案1】:

删除你的AwaitGetToken方法,没用。 现在将 GetToken 方法设为 public 并使用 await 调用它:

await tokenService.GetToken();
await GetXFMapUserFromAzureAndSetVariable(RestAccess.User);
await _navigationService.NavigateAsync("ZleceniaListContentPage", par);

基本上,您总是需要等待返回 Task 的方法,否则它将以并行方式运行,您的代码将失去一致性。

您似乎对Taskasync/await 感到很困惑,我强烈建议您阅读有关它的教程和文档:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

【讨论】:

  • 我做了这个,但可能是问题,因为我调用 tokenService.GetToken() 的方法是绑定方法,它导航到下一个视图。它被声明为 public void GoToZleceniaListContentPageNavigation()。而且我在使用 await tokenService.GetToken() 时遇到问题 - 这是不正确的。因此我创建了 tokenservice.AwaitGetToken()。我不能那样做吗?此 GetXFMapUserFromAzureAndSetVariable(RestAccess.User) 工作正常。它是相似的。谢谢。
  • 对不起,伙计,我一个字都听不懂。我只能建议您了解有关任务的更多信息。您似乎错过了很多整体逻辑。
  • 非常感谢 :-) 我再次跟踪代码,发现了一个愚蠢的错误。我纠正了它,你所有的提示都有效!!谢谢
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 2018-05-27
  • 1970-01-01
  • 2016-09-11
  • 2015-06-04
  • 2015-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多