2014-07-16 3 views
1

MVVM Light가 포함 된 Windows 8.1 앱 (XAML/C#)을 개발하고 있습니다.W8.1 Live SDK 5.6 - LiveAuthClient.InitializeAsync System.NullReferenceException

필자는 디버깅을 위해 필자의 LiveId를 코드 안에 보관했지만, 지금은 LogIn을 할 시간입니다.

this.authClient = new LiveAuthClient(); 
LiveLoginResult loginResult = await this.authClient.InitializeAsync(scopes); 

그것은 나에게 오류주고 유지 :

private static readonly string[] scopes = 
      new string[] { 
       "wl.signin", 
       "wl.basic", 
       "wl.offline_access"}; 

    private LiveAuthClient authClient; 
    private LiveConnectClient liveClient; 


    public DashboardView() 
    { 
     this.InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 
     this.InitializePage(); 
    } 

    private async void InitializePage() 
    { 
     this.authClient = new LiveAuthClient(); 
     LiveLoginResult loginResult = await this.authClient.InitializeAsync(scopes); 
     if (loginResult.Status == LiveConnectSessionStatus.Connected) 
     { 
      if (this.authClient.CanLogout) 
      { 
       this.btnLogin.Content = "Sign Out"; 
      } 
      else 
      { 
       this.btnLogin.Visibility = Visibility.Collapsed; 
      } 

      this.liveClient = new LiveConnectClient(loginResult.Session); 
      this.GetMe(); 
     } 
    } 

    private async void btnLogin_Click(object sender, RoutedEventArgs e) 
    { 
     if (this.btnLogin.Content.ToString() == "Sign In") 
     { 
      LiveLoginResult loginResult = await this.authClient.LoginAsync(scopes); 
      if (loginResult.Status == LiveConnectSessionStatus.Connected) 
      { 
       if (this.authClient.CanLogout) 
       { 
        this.btnLogin.Content = "Sign Out"; 
       } 
       else 
       { 
        this.btnLogin.Visibility = Visibility.Collapsed; 
       } 

       this.liveClient = new LiveConnectClient(loginResult.Session); 
       this.GetMe(); 
      } 
     } 
     else 
     { 
      this.authClient.Logout(); 
      this.btnLogin.Content = "Sign In"; 
     } 
    } 

    private async void GetMe() 
    { 
     Task<LiveOperationResult> task = this.liveClient.GetAsync("me"); 

     var result = await task; 
     dynamic profile = result.Result; 
    } 

나는 심지어 일부 시도 : 코드

An exception of type 'System.NullReferenceException' occurred in mscorlib.dll but was not handled in user code

Additional information: Object reference not set to an instance of an object.

소스를

현재 나는이 코드 조각으로 붙어있어 다른 범위와 이것은 나의 마지막 시도이었다.

미리 감사드립니다.

+0

http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it –

+1

@ SonerGönül 좋아, 내가 알고하지만 난 var authClient를 초기화했습니다. 코드에서 초기화되지 않은 변수는 어디에 있습니까? –

+0

LiveConect Auth (SkyDrive 용) NullReferenceException (WTH)? (http://stackoverflow.com/questions/21247297/liveconect-auth-for-skydrive-nullreferenceexception-wth) –

답변

1

필자의 경우 인터페이스 및/또는 클래스 라이브러리를 통해 LiveAuthClient.LoginAsync을 호출 할 때 문제가 발생했다. 문제를 해결하기 위해 MVVMLight 라이브러리의 조정자 Messenger 클래스를 사용하여 저장소와 연결된 응용 프로그램 항목 프로젝트에서 로그인했습니다. 앱을 상점과 연결하려면 http://www.codeproject.com/Articles/708863/Developer-Guide-to-Write-Windows-Store-App-usi 문서를 따르세요.

내보기 모델은 별도의 (휴대용) 라이브러리에 있으며 NullReferenceException 메시지 클래스를 만들지 않고 로그인하기 위해 서비스 인터페이스를 포함하는 계약 라이브러리를 참조합니다.

이 솔루션은 WP8.1 용이지만 플랫폼은 동일한 SDK를 공유하므로 작동해야합니다. 샘플 코드에서 MVVM 라이트에서 Messenger와 SimpleIoc을 사용하고 있습니다.

메시지 클래스 :의

public class OneDriveLoginRequestMessage 
{ 
    public Action CallbackAction { get; set; } 
} 

등록 인스턴스 당신의 OneDriveClient (또는 당신은 당신의 래퍼를 호출하지만) 나는에 코드를 다음과 같은 방법 RootFrame_FirstNavigated 추가에 MVVMLight의 SimpleIoc

SimpleIoc.Default.Register(() => new OneDriveClient()); 

App.xaml.cs 내부 파일을 사용하고 있습니다 로그인 :

Messenger.Default.Register<OneDriveLoginRequestMessage>(this, async (msg) => 
{ 
    await SimpleIoc.Default.GetInstance<OneDriveClient>().Login(); 
    if (msg != null && msg.CallbackAction != null) 
    { 
     msg.CallbackAction(); 
    } 
}); 

그리고 마지막으로는 뷰 모델에서 로그인 :

private void NavigateToOneDrivePage() 
{ 
    MessengerInstance.Send(new OneDriveLoginRequestMessage 
    { 
     CallbackAction = async() => 
     { 
      // after login continue here... 
      var client = SimpleIoc.Default.GetInstance<OneDriveClient>(); 
     } 
    }); 
} 

나는 그 문제가 해결되기를 바랍니다.

최저

, M

+1

제 문제는 상점과 관련이 없습니다 ... 감사합니다. 그러나 나는 그 코드를 viewmodel 내부에서 호출하기를 원하기 때문에 이미 사용하고 있지만 LiveId를 얻기 위해 사용하지는 않았다. –

+0

감사합니다. 나는 똑같은 문제가 있었다. –

관련 문제