【问题标题】:Reactive: Refresh AccessToken using observables反应式:使用可观察对象刷新 AccessToken
【发布时间】:2017-09-28 20:08:13
【问题描述】:

我不太明白如何调整 this approach 以生成动态计时器 observables。

具体来说,我有两种方法:

  1. GetAccessToken()
  2. RefreshAccessToken()

两者都返回OAuth2AccessTokenResponse

public class OAuth2AccessTokenResponse
{
    private string tokenType;
    private string accessToken;
    private int expiresIn;
    private string refreshToken;
    private int refreshtokenExpiresIn;
}

所以,我需要在 expiresIn 属性值(以秒为单位)过去之前刷新当前的访问令牌。

我尝试了我的方法,但我无法获得任何有意义的东西:

this.accessTokenObservable = Observable
    .Generate(
        this.GetAccessToken(),
        resp => true, //?????
        resp => resp, //?????
        resp => resp, //?????
        resp => TimeSpan.FromSeconds(this.RefreshAccessToken().ExpiresIn) //?????
    );

依次:

  1. response = this.GetAccessToken()
  2. response.ExpiresIn 到期之前 -> response = this.RefreshAccessToken()
  3. 转到2.

GetAccessTokenRefreshAccessToken 代码:

internal OAuth2AccessTokenResponse GetAccessToken()
{
    return new OAuth2AccessTokenResponse() {ExpiresIn = new Math.Random().Next(3,11)};
}

internal OAuth2AccessTokenResponse RefreshAccessToken()
{
    return new OAuth2AccessTokenResponse() {ExpiresIn = new Math.Random().Next(3,11)};
}

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?我需要能够编写适用于GetAccessTokenRefreshAccessToken 的代码,所以我需要所有类型。
  • 您是说拥有GetAccessTokenRefreshAccessToken 代码对您来说是正确的吗?
  • 我的意思是我需要能够复制、粘贴和编译您的代码,这样我才能使用它。现在,当我复制您发布的内容时,我会遇到很多错误。 IRestClientRestSharpthis.settingsIRestRequestAccessTokenRequestIRestResponse<>RefreshTokenRequestthis.CheckResponse 都是未定义的。您应该让我们轻松回答您的问题。 minimal reproducible example 意味着我有可以编译的代码。
  • 抱歉,我已尝试简化 GetAccessTokenRefreshAccessToken 方法。
  • 您很难将答案放在一起。您的代码仍然无法编译。

标签: c# system.reactive


【解决方案1】:

修复一些编译错误后,这似乎对我有用:

void Main()
{
    var accessTokenObservable = Observable
        .Generate(
            this.GetAccessToken(),
            atr => true,
            atr => this.RefreshAccessToken(),
            atr => atr,
            atr => TimeSpan.FromSeconds(atr.ExpiresIn)
        );

    accessTokenObservable.Subscribe(x => Console.WriteLine(x.ExpiresIn));
}

internal OAuth2AccessTokenResponse GetAccessToken()
{
    Console.WriteLine("!");
    return new OAuth2AccessTokenResponse() { ExpiresIn = rnd.Next(3, 11) };
}

internal OAuth2AccessTokenResponse RefreshAccessToken()
{
    Console.WriteLine("+");
    return new OAuth2AccessTokenResponse() { ExpiresIn = rnd.Next(3, 11) };
}

private Random rnd = new Random();

public class OAuth2AccessTokenResponse
{
    private string tokenType;
    private string accessToken;
    private int expiresIn;
    private string refreshToken;
    private int refreshtokenExpiresIn;

    public int ExpiresIn;
}

我得到这样的结果:

! 10 + 10 + 3 + 9 +

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多