Spotify Auth отменен, индекс вне диапазона - PullRequest
0 голосов
/ 25 сентября 2018

Я создаю приложение Spotify, используя SpotifyAPI-NET .После аутентификации я получаю индекс вне диапазона.Я не знаю, почему это происходит, поскольку кажется, что это на стороне API, и сообщение об исключении бесполезно, поскольку оно многопоточное.

private static SpotifyWebAPI _spotify;

//...in an async method
WebAPIFactory webApiFactory = new WebAPIFactory(
    Spotify.RedirectURL, //http://localhost:8008/test/
    Spotify.Port, //8000
    Spotify.ClientID,
    Scope.UserReadPrivate,
    TimeSpan.FromSeconds(20)
);

try {
    _spotify = await webApiFactory.GetWebApi(); //exception here
} catch (Exception ex) {
    Console.WriteLine(ex.Message);
}

Сервер работает нормально, и поэтомуаутентификация, пока я не нажму кнопку ОК.Затем он перенаправляет на страницу с «Отмена авторизации Spotify!»и я получаю исключение индекса из диапазона.

Вот исключение:

    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out 
of range. Must be non-negative and less than the size of the collection.
Parameter name: index
    at System.Collections.ArrayList.get_Item(Int32 index)

    at System.Collections.Specialized.NameValueCollection.GetKey(Int32 index)

    at System.Web.HttpValueCollection.Get(Int32 index)

    at SpotifyAPI.Web.SimpleHttpServer.<>c__DisplayClass6_1.<HandleGetRequest>b__2(Object o)

    at System.Threading.ThreadHelper.ThreadStart_Context(Object state)

    at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)

    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)

    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

    at System.Threading.ThreadHelper.ThreadStart(Object obj)

Я попытался войти в систему другим способом, но, похоже, он тоже не работает:

using static SpotifyAPI.Web.Enums.Scope;

static AutorizationCodeAuth auth;

//...
auth = new AutorizationCodeAuth {
    ClientId = Spotify.ClientId,
    RedirectUri = Spotify.RedirectUrl,
    Scope = PlaylistModifyPublic | PlaylistModifyPrivate | PlaylistReadPrivate | Streaming | UserReadPrivate | UserReadEmail | UserLibraryRead | UserLibraryModify | UserFollowModify | UserFollowRead | UserReadBirthdate | UserTopRead | PlaylistReadCollaborative | UserReadRecentlyPlayed | UserReadPlaybackState | UserModifyPlaybackState,
    ShowDialog = true
};
auth.OnResponseReceivedEvent += Auth_OnResponseReceivedEvent;
auth.StartHttpServer(Spotify.WebPort);
auth.DoAuth();

private static void Auth_OnResponseReceivedEvent(AutorizationCodeAuthResponse response) {
    Token token = auth.ExchangeAuthCode(response.Code, Spotify.ClientSecret);
    SpotifyWebAPI api = new SpotifyWebAPI {
        AccessToken = token.AccessToken,
        TokenType = token.TokenType
    };
    PrintUsefulData(api);
}

private static async void PrintUsefulData(SpotifyWebAPI api) {
    PrivateProfile profile = await api.GetPrivateProfileAsync();
    string name = string.IsNullOrEmpty(profile.DisplayName) ? profile.Id : profile.DisplayName;
    Console.WriteLine($"Hello there, {name}!"); //name is always empty
}
...