2011-10-25 17 views
0

これは、ユーザ名とパスワードSilverlightの有効WCFサービス再調整値

[OperationContract] 

    public bool LoginCheck(string username, string password) 
    { 
     RoadTransDataContext db = new RoadTransDataContext(); 

     var _Pass = (from d in db.users where d.username == username select d.password).SingleOrDefault(); 

     if (_Pass == password) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

をチェックし、これが

private void LoginCheckCompleted(object sender, ServiceReference.LoginCheckCompletedEventArgs e) 
    { 
     _Log = e.Result; 
    } 

    private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     ServiceReference.ServiceClient webservice = new ServiceReference.ServiceClient(); 

     webservice.LoginCheckCompleted += new EventHandler<ServiceReference.LoginCheckCompletedEventArgs>(LoginCheckCompleted); 
     webservice.LoginCheckAsync(txtUserName.Text, txtPassword.Password); 

     if (_Log == true) 
     { 
      this.DialogResult = true; 
      this.Close(); 
     } 
    } 

問題はOKButton_Clickメソッドが終了したときにLoginCheckCompletedメソッドが呼び出していることである子ウィンドウである私のサービスです。正しいユーザー名を入力したら、パスしてボタンを押しても何もしません。もう一度クリックするとウィンドウが閉じます。

+0

ところで、サービスメソッドのコードサイズを減らすことができます: 'return db.users.Where(d => d.username == username && d.password ==パスワード).Any(); ' – vorrtex

答えて

2

SilverlightはWebサービスを呼び出す非同期モデルを使用し、応答が返されるまで待ちます。あなたの例では、_Log = e.Result;というアサイメントが呼び出されますが、1〜2秒後には、if (_Log == true)というチェックが無条件に呼び出されますが、割り当て前に呼び出されます。

なぜなら、コールバックに必要なコードをすべて入れ、非同期呼び出し後にすべてのコードを削除する必要があるからです。

private void LoginCheckCompleted(object sender, ServiceReference.LoginCheckCompletedEventArgs e) 
{ 
    _Log = e.Result; 

    if (_Log == true) 
    { 
     this.DialogResult = true; 
     this.Close(); 
    } 
} 

private void OKButton_Click(object sender, RoutedEventArgs e) 
{ 
    ServiceReference.ServiceClient webservice = new ServiceReference.ServiceClient(); 

    webservice.LoginCheckCompleted += new EventHandler<ServiceReference.LoginCheckCompletedEventArgs>(LoginCheckCompleted); 
    webservice.LoginCheckAsync(txtUserName.Text, txtPassword.Password); 
} 
関連する問題