Silverlight включен значение перенастройки службы wcf - PullRequest
0 голосов
/ 25 октября 2011

Это мой сервис, который проверяет имя пользователя и пароль

   [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();
        }
    }

проблема в том, что LoginCheckCompleted метод вызывается, когда OKButton_Click метод завершен. поэтому, если он введет правильное имя пользователя, передайте и нажмите кнопку, ничего не делая, если я снова нажму один раз, закрытие окна

1 Ответ

2 голосов
/ 25 октября 2011

Silverlight использует асинхронную модель вызова веб-служб, и требуется некоторое время для ожидания ответа. В вашем примере задание _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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...