Проблема с веб-сервисом Silverlight - PullRequest
2 голосов
/ 10 октября 2010

У меня есть веб-сервис, который вызывает метод и возвращает общий список.Метод завершенного веб-сервиса выглядит следующим образом (примечание: имена и e.Result относятся к одному и тому же типу списка):

   void SetNames()
   {    
        ServiceReference1.ServiceClient webservice = new ServiceReference1.ServiceClient();

        webservice.GetNameCompleted += new EventHandler<GetNameCompletedEventArgs>(webservice_GetNameCompleted);
        webservice.GetNameAsync();
    }
    private void webservice_GetNameCompleted(object sender, ServiceReference1.GetNameCompletedEventArgs e)
    {
       names = e.Result;     
    }

Проблема, с которой я столкнулся, заключается в том, что я могу получить только элементы всписок имен в методе веб-сервиса.Всякий раз, когда я пытаюсь получить доступ к элементам в списке имен где-либо за пределами этого метода, он пуст.Например (это ничего не отображает в текстовом поле),

List<string> names = new List<string>();

public MainPage()
{
    InitializeComponent();
    SetNames();

    foreach (string name in names)
        textBox1.Text += name;
 }

Но это покажет правильную вещь:

private void webservice_GetNameCompleted(object sender, ServiceReference1.GetNameCompletedEventArgs e)
    {
       names = e.Result;

       foreach (string name in names)
          textBox1.Text += name;     
    }

Я новичок в Silverlight и веб-службах, и явероятно, что-то просматривая.Я работал над этим некоторое время, и я чувствую, что мне нужно обратиться за помощью.Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

В Silverlight все вызовы веб-служб асинхронные (в отличие от WPF, который также может использовать синхронный вызов).

Это означает, что код после вызова веб-службы будет вызван до того, как служба отправит ответ клиенту Silverlight.

Итак, в конструкторе MainPage цикл foreach выполняет итерацию по коллекции ДО возвращения службы, а затем выполняет итерацию по пустой коллекции.

Правильный путь для продолжения - второй: инициализация коллекции после ответа службы, в методе обратного вызова, выделенном для этой задачи: webservice_GetNameCompleted.

1 голос
/ 10 октября 2010

Вам нужно дождаться завершения обратного вызова веб-службыc. По умолчанию все вызовы веб-службы Silverlight WCF являются асинхронными. вы отправляете запрос в веб-службу, и в отличие от .asmx с WCF и Silverlight приложение продолжает работать, вместо того, чтобы ждать, пока веб-служба вернет результат.

Поэтому, когда вы делаете звонок, как:

public MainPage() 

{

InitializeComponent(); 
SetNames(); 

foreach (string name in names) 
    textBox1.Text += name; 

}

Приложение не останавливается и ждет, пока SetNames вернет значение, которое оно просто переносит, и, поскольку веб-служба не вернула результат, у вас все еще есть пустой или нулевой список, когда вы вызываете foreach.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...