2016-08-04 6 views
0

Etwas, das ich nicht verstehe, passiert in meiner Logik, ich bekomme keine Erwartungen, aber meine Anwendung stürzt ab.UWP Wcf Service Anruf Async schlägt fehl, wenn zweimal aufgerufen

Code:

ChatClient Service = new ChatClient(); 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     var temp = Service.AuthenicateAsync(T1.Text, T2.Text).Result; 
    } 

ChatClient Code:

public User Authenicate(string username, string password) 
    { 
     Clock.Restart(); 

     var User = new User(); 
     var Valid = false; 

     try 
     { 

      var VerificationQuery = Provider.CreateAdoCommand("select count(AccessToken) as 'Verified' from Users where [email protected] and [email protected];", Provider.CreateParameter("@user", DbType.String), Provider.CreateParameter("@pass", DbType.String)); 
      var reader1 = VerificationQuery.ExecuteReader(username, password); 
      using (reader1.Open()) 
      {//Check to see if the username and password is valid 
       while (reader1.MoveNext()) 
       { 
        if (reader1.GetInt32("Verified").Value == 1) 
        { 
         Valid = true; 
        } 
       } 
      } 

      if (Valid) 
      { 
       var TokenQuery = Provider.CreateAdoCommand("select AccessToken, Timeout from Users where [email protected] and [email protected]", Provider.CreateParameter("@user", DbType.String), Provider.CreateParameter("@pass", DbType.String)); 
       var reader2 = TokenQuery.ExecuteReader(username, password); 
       using (reader2.Open()) 
       {//If the username and password is valid, retrieve the token and timeout period 
        while (reader2.MoveNext()) 
        { 
         User.AccessToken = reader2.GetString("AccessToken"); 
         User.TimeoutPeriod = reader2.GetDateTime("Timeout").Value; 
        } 
       } 

       //Check to see how old the timeout period is 
       var timeSub = User.TimeoutPeriod.Subtract(DateTime.Now); 
       if (timeSub.Days < 2) 
       { 
        //The token is too old, update the token, old token and timeout period 
        var TokenUpdateQuery = Provider.CreateAdoCommand("update Users set AccessToken=(NEWID()), [email protected], [email protected]", Provider.CreateParameter("@oldToken", DbType.String), Provider.CreateParameter("@newTime", DbType.Date)); 
        using (TokenUpdateQuery.Open()) 
        { 
         TokenUpdateQuery.ExecuteNonQuery(User.AccessToken, DateTime.Now.AddDays(30)); 
        } 

        var FinalQuery = Provider.CreateAdoCommand("select AccessToken, Timeout from Users where [email protected] and [email protected]", Provider.CreateParameter("@user", DbType.String), Provider.CreateParameter("@pass", DbType.String)); 
        var reader3 = FinalQuery.ExecuteReader(username, password); 
        using (reader3.Open()) 
        { 
         while (reader3.MoveNext()) 
         { 
          User.AccessToken = reader3.GetString("AccessToken"); 
          User.TimeoutPeriod = reader3.GetDateTime("Timeout").Value; 
         } 
        } 
       } 

       //Database Query for user information 
       var UserQuery = Provider.CreateAdoCommand("select FirstName, LastName, Email, DateCreated, AccessToken, OldAccessToken, Timeout, ConnectionId from [Users] where [email protected];", Provider.CreateParameter("@token", DbType.String)); 
       var reader4 = UserQuery.ExecuteReader(User.AccessToken); 

       using (reader4.Open()) 
       { 
        while (reader4.MoveNext()) 
        { 
         if (reader4.GetString("AccessToken").Equals(User.AccessToken)) 
         { 
          User.FirstName = reader4.GetString("FirstName"); 
          User.LastName = reader4.GetString("LastName"); 
          User.Email = reader4.GetString("Email"); 
          User.AccessToken = reader4.GetString("AccessToken"); 
          User.OldAccessToken = reader4.GetString("OldAccessToken"); 
          User.TimeoutPeriod = reader4.GetDateTime("Timeout").Value; 
          User.DateCreated = reader4.GetDateTime("DateCreated").Value; 
          User.ConnectionId = reader4.GetString("ConnectionId"); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception) 
     { 

     } 

     Clock.Stop(); 
     User.SecondsProcessed = Clock.Elapsed.TotalSeconds; 
     return User; 

    } 

Service ist ein WCF-Dienst auf meinem Web-Server gehostet, die mit Visual Studio wurden hinzugefügt. In meiner Anwendung habe ich zwei Textfelder und eine Schaltfläche. Wenn Sie auf diese Schaltfläche klicken, wird diese Methode ausgelöst. Das erste Mal funktioniert es. Wenn Sie ein zweites Mal darauf klicken und einem Haltepunkt folgen, trifft er auf var temp ... aber dann fällt er einfach ab und meine Anwendung stürzt ab.

+0

Was ist mit Service-Code? – EJoshuaS

+0

Wenn das sicher helfen wird, ist es eine anständige Größe des Codes. –

+0

Haben Sie Protokolle darüber, was im Service passiert? – EJoshuaS

Antwort

0

Ich kann es wirklich nicht erklären. Aber das Ändern der Methode, so zu funktionieren, funktioniert. Ich meine, ich kann, weil die Async-Methode aufgerufen wird, müssen Sie darauf warten, um Daten zu erhalten. Daher muss das async-Schlüsselwort der Methode hinzugefügt werden.

private async void button_Click(object sender, RoutedEventArgs e) 
    { 
     var temp = await Service.AuthenicateAsync("", ""); 
    }