Как мне вызвать службы WCF в Silverlight? - PullRequest
1 голос
/ 24 августа 2010

Может кто-нибудь сказать мне, почему это не работает.Я создал службу WCF, которая возвращает список клиентов из базы данных Northwind.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Activation;

namespace WCFSilverlight.Web
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Customers" in code, svc and config file together.
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

    public class Customers : ICustomers
    {

        IEnumerable<Customer> ICustomers.GetAllCustomers()
        {
            NorthwindEntities objNorthwindEntities = new NorthwindEntities();
            var query = from cust in objNorthwindEntities.Customers
                        select cust;
            return query.ToList();
        }
    }
}

И это мой фрагмент кода App.xaml.cs: -

private void Application_Startup(object sender, StartupEventArgs e)
{
    this.RootVisual = new MainPage();
    CustomersClient objCustomersClient = new CustomersClient();
    objCustomersClient.GetAllCustomersCompleted += new EventHandler<GetAllCustomersCompletedEventArgs>(client_GetNameCompleted);
    objCustomersClient.GetAllCustomersAsync();
}

void client_GetNameCompleted(object sender, GetAllCustomersCompletedEventArgs e)
{
    MessageBox.Show(e.Result.ToString());      
}

Если яне ошибочно, методы в Silverlight вызываются асинхронно.Поэтому я добавил обработчик событий для его обработки, а затем вызвал метод для извлечения клиентов.Но я ничего не получаю в Messagebox.Кроме того, когда я пытаюсь сохранить точку останова на client_GetNameCompleted, она никогда не выполняется.Но если я оставлю это в Application_Startup, оно выполнится.В чем может быть проблема?

Также объясните мне, правильно ли я делаю?Я видел один пример, где один человек напрямую определяет функцию, используя некоторые странные символы, такие как =>.

РЕДАКТИРОВАТЬ 1: - Пожалуйста, объясните мне, что такое e.UserState в e.Что он содержит и что я могу с ним сделать?

РЕДАКТИРОВАТЬ 2: - : - Я получаю эту ошибку http://img178.imageshack.us/img178/9070/53923202.jpg

Служба WCF работает отличноЯ проверил запрос ссылки.Таким образом, нет проблем с подключением к Sql Server или WCF.Что-то не так только с моим клиентом.

Это мой ServiceReference.ClientConfig: -

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ICustomers" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:50622/Customers.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_ICustomers" contract="CustomerServ.ICustomers"
                name="BasicHttpBinding_ICustomers" />
        </client>
    </system.serviceModel>
</configuration>

Теперь вы можете сказать мне, что не так?

Заранее спасибо:)

Обновление: - Я читал в Google, вам нужно установить режим сериализации однонаправленным.Но где мне это установить?Что мне написать где?

1 Ответ

2 голосов
/ 24 августа 2010
  1. Вы правы, все сетевые вызовы в Silverlight выполняются асинхронно.
  2. Упоминаемый вами синтаксис => является сокращением для определения метода делегата, который называется лямбда-выражением.(см. ниже)
  3. Вы должны иметь возможность установить точку останова в обработчике события Completed, если не попробуете перезапустить Visual Studio (раньше я видел, как это работает странно).
  4. e.UserState будет иметь ссылку на любой объект, который вы поместите в переменную UserState для асинхронного вызова (обратите внимание на дополнительную перегрузку).

Код:

objCustomersClient.GetAllCustomersCompleted = delegate(object Sender, GetAllCustomersCompletedEventArgs e) 
{
    MessageBox.Show(e.Result.ToString());        
}; 

// is the same as

objCustomersClient.GetAllCustomersCompleted += new EventHandler<GetAllCustomersCompletedEventArgs>(client_GetNameCompleted); 
void client_GetNameCompleted(object sender, GetAllCustomersCompletedEventArgs e) 
{ 
    MessageBox.Show(e.Result.ToString());       
} 

// which is same as

objCustomersClient.GetAllCustomersCompleted += (sender, e) => { MessageBox.Show(e.Result.ToString());  }; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...