Отображение данных в DataGrid при помощи LINQ и WCF в Silverlight - Создание веб-сервиса WCF

ОГЛАВЛЕНИЕ

Создание веб-сервиса WCF

Вы создали класс LINQ (хотя не создали запрос) и теперь веб-сервис (и Intellisense) будет знать о классе Customer и его членах. Теперь вы можете создать веб-сервис при помощи Visual Studio 2008.

Щелкните правой кнопкой мыши по проекту и выберите пункт Add New и из шаблонов выберите WCF Service,

 

Рис. 3-9. Создание веб-сервиса WCF

Результатом будет создание трех новых файлов, которые содержат сервисы для вашего веб-сервиса WCF,

 

Рис. 3-10. Веб-сервис WCF, добавленный в ваш проект

Откройте первый файл, IService1.cs, который содержит контракт (contract), созданный Visual Studio 2008.

public interface IService1
{
   [OperationContract]
   void DoWork();

Мы можем заменить данную "пустышку" контракта любым контрактом, который необходимо будет предоставить веб-сервису. Для нашего примера нам небходимо указать то, что наш веб-сервис будет возвращать список объектов Customer при получении строки, которая представляет собой начало фамилии клиента.

Поэтому мы возвращаем значение метода с Void на List<Customer>. Тем не менее, как только вы начнете изменять тип возвращаемого значения, Intellisense сможет помочь вам с выбором, в частности, потому что мы создали данный тип ранее в определении класса LINQ.

 

Рис. 3-11. Intellisense теперь знает о Customer

Мы назовем метод GetCustomersByLastName.

public interface IService1
{
   [OperationContract]
   List<Customer> GetCustomersByLastName(string lastName);

Изменив контракт в интерфейсе вы должны изменить реализацию в файле .cs . Но зачем нам так мучиться? Когда вы доберетесь до файла cs просто нажмите на интерфейс и появится смарт-тег. Oткройте тег и он предложит вам создать скелет реализации!

 

Рис. 3-12. Intellisense может помочь в реализации интерфейса (Interface)

Выбросьте метод DoWork и заполните GetCustomersByLastName запросом LINQ:

public class Service1 : IService1
{
   #region IService1 Members
 
   public List<Customer> GetCustomersByLastName(string lastName)
   {
     DataClasses1DataContext db = new DataClasses1DataContext();
     var matchingCustomers = from cust in db.Customers
                 where cust.LastName.StartsWith(lastName)
                 select cust;
     return matchingCustomers.ToList();
   }
 
   #endregion

(Комментарий region поставлен в то место, где я попросил смарт-тег создать скелет реализации)

Синтаксис LINQ

Давайте разберем данное выражение LINQ. Сначала мы используем новую переменную интерфейса, которая, оказывается, не зависит от типа (она подразумевает тип, но сама по себе без типа!). Мы ей присвоим значение результата LINQ-запроса, который будет объектом типа IEnumerable.

Синтаксис запроса очень похож на часть SQL выражения Select. Другими словами: «Дайте мне соединение к базе данных, о которой я говорил ранее, и назовите данное соединение db. Перейдите в эту базу данных и найдите таблицу с названием Customers и отыщите все записи, где поле LastName начинается с букв, содержащихся в строке lastName. Дайте мне все результирующие записи. Присвойте все те записи к объекту matchingCustomers, который достаточно умен, чтобы знать о том, что А) он должен быть типа IEnumerable и что Б) когда я вызываю ToList() по отношению к нему, то он должен вернуть List<Customer>.».

Будьте внимательны с привязкой (Binding)!

WCF использует wsHttpBinding в качестве стандартной привязки в файле Web.config:

<services>
   <service behaviorConfiguration="SQLData_Web.Service1Behavior"
        name="SQLData_Web.Service1">
      <endpoint address="" binding="wsHttpBinding"
          contract="SQLData_Web.IService1">
        <identity>
           <dns value="localhost"/>
        </identity>
      </endpoint>
   </service>
</services> 

Тем не менее, Silverlight, поддерживает только основную привязку (SOAP 1.1, и т.д.), поэтому вам надо будет соответственно изменить привязку,
<endpoint address="" binding="basicHttpBinding" contract="SQLData_Web.IService1">

Все - у вас есть готовый сервис.