Блог Сергея Байдачного

Мой блог о технологиях

Posts Tagged ‘SilverLight 4

Live Smooth streaming

with one comment

На протяжении последних двух лет, я получаю вопросы от партнеров о том, как организовать Live Smooth Streaming.

Так, целых 2 года, Microsoft продвигает технологию Smooth Streaming. Идея технологии состоит в том, чтобы преобразовать видео в специальный формат, содержащий несколько потоков, расчитанных на разные каналы. С помощью специального модуля в IIS, файлы в формате Smooth можно транслировать в Веб. При этом, пользователю будет отображаться фрагмент (например, фрагменты по 2 сек.) в том качестве, которое он способен принять. Причем, на выбираемый фрагмент оказывает влияние как скорость канала, так и возможность процессора пользователя отобразить видео (не секрет, что на атомах видео в хорошем качестве идет не очень).

Итак, если у вас есть библиотека записанного видео, то с помощью Expression Encoder Вы можете его преобразовать в формат Smooth, выбрав количество потоков и их параметры, а затем транслировать все это с помощью модуля Smooth Streaming через IIS.

Однако, многие партнеры хотят работать именно с живым видео. Сегодня на многих порталах можно увидеть трансляции конференций, футбольных матчей и т. д. Транслировать футбольный матч в записи не интересно, так как смотреть его уже никто не будет.

Казалось бы, что в IIS уже все готово для трансляции Live Smooth. Так, вместе с модулем Smooth Streaming успешно устанавливался и Live Smooth Streaming.

Проблема в том, что последний принимает уже готовый поток в формате Smooth. Но Expression Encoder 3 (как и Windows Encoder) не позволяют преобразовывать живое видео в формат Smooth. Существующие реализации Live Smooth используют специальное оборудование (например, такое оборудование использовалось на зимних олимпийских играх). Подобное оборудование достаточно дорогое (от 15 000 долларов за сервер) и не продается в Украине.

Поэтому ответ о возможности трансляции Live Smooth был – нет.

Но вот, три дня назад, случилось чудо. В Майкрософт посчитали, что партнеры, выпускающие сервера, уже достаточно насытились и выпустили новый Encoder (4-ю версию), которая поддерживает Live Smooth!!!

image

Теперь с уверенностью можно сказать, что IIS 7.5+Encoder 4 позволяют реализовать любые сценарии. Ну а Silverlight – разработать любой интерфейс. Конкурентов этой тройке просто нет (как по функциональности, так и по стоимости решения).

Наслаждайтесь!

Реклама

Written by Sergiy Baydachnyy

15.06.2010 at 10:01

Опубликовано в SilverLight

Tagged with , ,

Моя книга о Silverlight 4 уже в продаже

19 комментариев

http://solon-press.ru/shop.html?id=495

Written by Sergiy Baydachnyy

19.04.2010 at 11:01

Опубликовано в SilverLight

Tagged with

Silverlight 4: Обработка ошибок при связывании

leave a comment »

Silverlight 3 поддерживал специальный механизм проверки данных при связывании с элементами управления – ValidatesOnException и NotifyOnValidationError. Первое свойство объекта типа Binding обеспечивало возможность визуального отображения ошибки (например, красный прямоугольник вокруг текстового поля), а второе – обеспечивало механизм перехвата и обработки ошибки в коде. Сама ошибка связывания должна была инициироваться исключением внутри класса, описывающего данные. То есть, если Вы выполняли связывание свойства FirstName класса Employee с текстовым полем, то обработку значения должно было выполнять само свойство и выбрасывать исключения всякий раз, когда устанавливаемое значение выглядело не корректно.

В Silverlight 4 механизм обработки ошибок при связывании был расширен следующими свойствами: ValidatesOnDataErrors и ValidatesOnNotifyDataErrors

ValidatesOnDataErrors

В отличие от ValidatesOnException, тут можно не вмешиваться в свойства класса, а вынести всю логику проверки и выдачи сообщений в отдельный метод, определяемый интерфейсом IDataErrorInfo. Это развязывает руки разработчику, позволяя создавать расширения существующих классов, просто определив производный класс, реализующий дополнительный интерфейс.

Рассмотрим простой класс Employee, реализующий интерфейс IDataErrorInfo. Приведем весь код этого класса:

   1:  public class Employee: 
   2:     INotifyPropertyChanged, IDataErrorInfo
   3:  {
   4:      public event PropertyChangedEventHandler PropertyChanged;
   5:   
   6:      public void OnPropertyChanged(PropertyChangedEventArgs e)
   7:      {
   8:          if (PropertyChanged != null)
   9:              PropertyChanged(this, e);
  10:      }
  11:   
  12:      private string firstName;
  13:      private string lastName;
  14:      private int age;
  15:      private string email;
  16:      private double salary;
  17:   
  18:      public double Salary
  19:      {
  20:          get 
  21:          { 
  22:              return salary; 
  23:          }
  24:          set 
  25:          { 
  26:              salary = value;
  27:              OnPropertyChanged(new PropertyChangedEventArgs("Salary"));
  28:          }
  29:      }
  30:   
  31:      public string FirstName
  32:      {
  33:          get { return firstName; }
  34:          set 
  35:          { 
  36:              firstName = value; 
  37:              OnPropertyChanged(new PropertyChangedEventArgs("FirstName"));
  38:          }
  39:      }
  40:   
  41:      public string LastName
  42:      {
  43:          get { return lastName; }
  44:          set
  45:          {
  46:              lastName = value;
  47:              OnPropertyChanged(new PropertyChangedEventArgs("LastName"));
  48:          }
  49:      }
  50:   
  51:      public string EMail
  52:      {
  53:          get { return email; }
  54:          set
  55:          {
  56:              email = value;
  57:              OnPropertyChanged(new PropertyChangedEventArgs("EMail"));
  58:          }
  59:      }
  60:   
  61:      public int Age
  62:      {
  63:          get { return age; }
  64:          set
  65:          {
  66:              age = value;
  67:              OnPropertyChanged(new PropertyChangedEventArgs("Age"));
  68:          }
  69:      }
  70:   
  71:      public override string ToString()
  72:      {
  73:          return String.Format("{0} {1}", firstName, lastName);
  74:      }
  75:   
  76:      string errors = null;
  77:   
  78:      public string Error
  79:      {
  80:          get { return errors; }
  81:      }
  82:   
  83:      public string this[string columnName]
  84:      {
  85:          get
  86:          {
  87:              string result = null;
  88:              if (columnName == "Age")
  89:              {
  90:                  if (Age <= 0)
  91:                  {
  92:                      result = "Age should be positive!";
  93:                  }
  94:                  else if (Age <= 16)
  95:                  {
  96:                      result = "You are too young!";
  97:                  }
  98:              }
  99:              return result;
 100:          }
 101:      }
 102:  }

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

Следовательно, данных подход правильно применять скорее для отображения предупреждений, а не для проверки критических ошибок. Так, в примере выше, мы могли бы вынести проверку свойства Age на негативное значение в исключение, а проверку на совершеннолетие оставить в индексаторе.

Чтобы инициировать выдачу сообщений об ошибках, описанных в индексаторе, нужно воспользоваться свойством класса BindingValidatesOnDataErrors:

<TextBlock Text="Age:" Grid.Row="3" Grid.Column="0"></TextBlock>
<TextBox Text=
   "{Binding Path=Age, Mode=TwoWay, ValidatesOnDataErrors=True,
     NotifyOnValidationError=True}"
   BindingValidationError="TextBox_BindingValidationError"
   Grid.Row="3" Grid.Column="1">
</TextBox>

Естественно, что ValidatesOnDataErrors и ValidatesOnExceptions не могут отрабатывать одновременно. Иными словами, если у Вас есть готовый класс, описывающий некоторый объект, при этом его свойства выполняют проверку данных и выбрасывают исключения, то ValidatesOnDataErrors использовать нельзя, так как он полностью игнорируется при появлении исключения (даже если ValidatesOnExceptions установлен в false).

 

ValidatesOnNotifyDataErrors

К сожалению, не всегда данные можно проверить сразу же на клиенте. Очень часто необходимо обратиться к источнику данных, который расположен на удаленном сервере. Лишь после этого можно сделать вывод о корректности данных. Естественно, что описанные выше механизмы не подходят для удаленной проверки данных, так как заблокируют интерфейс на время соединения с источником данных. Поэтому Silverlight 4 представляет новый механизм, позволяющий вести асинхронную проверку данных.

Чтобы обеспечить асинхронную проверку данных, класс, описывающий данные, должен реализовывать интерфейс INotifyDataErrorInfo. Тут описаны свойство HasErrors, определяющее наличие ошибок при асинхронной проверке данных, метод GetErrors, возвращающий объект перечислимого типа, содержащий ошибки, а также событие ErrorsChanged, которое инициируется при любом изменении коллекции ошибок.

Чтобы активировать работу интерфейса INotifyDataErrorInfo, необходимо воспользоваться свойством класса Binding – ValidatesOnNotifyDataErrors, установив его значение в true.

Особенностью этого подхода является возможность его комбинации с описанными выше подходами.

Written by Sergiy Baydachnyy

15.03.2010 at 09:33

Опубликовано в SilverLight

Tagged with

Перерыв

8 комментариев

Долго ничего не писал. Все от того, что к запуску Visual Studio 2010, который состоится 20 апреля в Киеве, мы хотели каждому участнику события выдать книгу по Silverlight 4.

Вот написанием этой книги я и занимался. Сегодня у меня большое счастье – я дописал этот труд, который получился не очень, на мой субъективный взгляд. Можно было написать в два раза больше, но пришлось ограничиться объемом в 350 страниц – больше – не успели бы напечатать.

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

Ниже привожу содержание книги:

Глава 1. Введение в Silverlight 4

Глава 2. Начинаем работу с Silverlight

Глава 3. Архитектура Silverlight

Глава 4. Использование XAML

Глава 5. Элементы управления и события

Глава 6. Привязка к данным

Глава 7. Взаимодействие с сервером

Глава 8. Графика, трансформация и анимация

Глава 9. Работа с аудио и видео

Глава 10. Ресурсы и стили

Глава 11. Создание шаблонов элементов управления

Глава 12. Отладка приложений и тестирование

Глава 13. Создание сложных приложений

Глава 14. Использование Deep Zoom

Глава 15. Интеграция с SharePoint 2010

Глава 16. Введение в Microsoft Expression Studio

Written by Sergiy Baydachnyy

04.03.2010 at 16:33

Опубликовано в SilverLight

Tagged with

Отладка Silverlight в Visual Studio

5 комментариев

Использование Visual Studio начало притуплять мою сообразительность. Как ни странно, но настройки по умолчанию обычно полностью подходят для реализации задуманного. Правда, когда начиинаешь писать что-то сложное, то тут же натыкаешься на грабли. К примеру, последнее приложение, которое я разрабатывал, представляло собой шаблон для SharePoint 2010, который включал компоненты и на SilverLight. И вот мне понадобилось отладить Silverlight-приложение в контексте SharePoint. И это в то время, когда редактор был настроен на отладку кода под SharePoint, но никак не Silverlight. Немного потупил, а потом решил написать следующий пост:)

Итак,

Visual Studio 2010 позволяет отлаживать Silverlight-приложения подобно другим типам приложений. Если Вы планируете приступить к отладке Silverlight-приложения, то достаточно запустить его с помощью команды Debug->Start Debugging (F5). Расставляя в желаемых местах точки останова, Вы сможете наблюдать за ходом выполнения приложения, имея доступ ко всем известным окнам: Autos, Locals, Watch.

Однако, отладка Silverlight-приложения, может потребовать отлаживать и JavaScript. Visual Studio позволяет отлаживать JavaScript без всяких проблем. Но, если Вы поставите точку останова в JavaScript во время отладки, то ничего не произойдет. Это связано с тем, что Visual Studio не позволяет отлаживать сразу два типа приложений (Silverlight и JavaScript). А Silverlight-проект настроен таким образом, что включает отладку для Silverlight по умолчанию.

Чтобы включить отладку JavaScript в Вашем приложении, в Visual Studio доступно два способа.

Способ 1. Для включения отладки JavaScript (на самом деле выключения отладки Silverlight) достаточно просто открыть свойства проекта, где на вкладке Web, снять флаг Silverlight (раздел Debuggers). Это простое действие позволит отлаживать JavaScript, но точки останова для Silverlight работать перестанут. Описанное выше действие нужно сделать для Web-приложения, которое содержит встраиваемый Silverlight-компонент.

image

@1 Установка отладчика по умолчанию

Способ 2. Выбрать тип приложения, которое Вы планируете отлаживать, можно при подключении к процессу. Для этого запустите Silverlight-приложение НЕ в режиме отладки, а обычным способом (Start Without Debugging (Ctrl+F5)). Когда приложение откроется в браузере, выполните команду Debug->Attach to Process

image

@2 Выбор процесса

В появившемся окне достаточно легко найти экземпляр Вашего браузера, выполняющего Silverlight-приложение. Нужный Вам процесс содержит значения Script и Silverlight в колонке Type. Чтобы переключатся между этими двумя типами приложения, нажмите кнопку Select. В появившемся окне выберите нужный тип.

image

@3 Выбор типа отлаживаемого приложения

Описанные способы можно применять не только при создании простых Web-приложений, но и при создании сложных проектов на базе SharePoint 2010 или другой платформы, когда ошибку может вызывать не только Silverlight-приложение, но и механизмы интеграции с хостом.

Written by Sergiy Baydachnyy

16.02.2010 at 11:14

Опубликовано в SharePoint, SilverLight

Tagged with

SharePoint 2010 и SilverLight: Client API

14 комментариев

В завершении темы по интеграции Silverlight и SharePoint 2010, рассмотрим возможность использования Client API, поставляемого с SharePoint.

В отличие от служб REST, Client API позволяет делать практически все: взаимодействовать с любыми объектами, создавать сайты, управлять процессами.

Чтобы использовать Client API для Silverlight, необходимо подключить две сборки: Microsoft.SharePoint.Client.SilverLight.dll и Microsoft.SharePoint.Client.SilverLight.Runtime.dll. Первая сборка отвечает за классы, описывающие объекты SharePoint, а вторая сборка берет на себя задачи, связанные с коммуникациями. Обе сборки находятся в папке C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ClientBin.

Замечание. В Visual Studio 2010 beta 2 существует странная ошибка. Если Вы попытаетесь добавить описанные сборки по указанному пути, то Visual Studio сгенерирует ошибку. Поэтому скопируйте данные сборки в директорию Вашего проекта.

Модифицируем код нашего примера так, чтобы он использовал Client API. Приведу сразу готовый код:

ListItemCollection items=null;
 
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    ClientContext context = new ClientContext("http://sbaydach64");
 
    Web myWeb=context.Web;
 
    List myListSP = myWeb.Lists.GetByTitle(curList);
 
    items = myListSP.GetItems(
        CamlQuery.CreateAllItemsQuery());
 
    context.Load(items);
    context.ExecuteQueryAsync(client_Completed, null);
}
 
private void client_Completed(object sender, 
    ClientRequestSucceededEventArgs e)
{
    System.Windows.Deployment.Current.Dispatcher.BeginInvoke(
    delegate() 
    {
        foreach (ListItem item in items)
        {
            myList.Items.Add(item.FieldValues["FileLeafRef"]);
        }
 
        myList.SelectedIndex = 0;
    }
    );
}

Основной класс, в коде выше, это ClientContext, который является единственным механизмом для получения доступа ко всем объектам SharePoint. Создав объект этого класса, разработчику требуется сформировать запрос. При формировании запроса, Вы можете ссылаться на любые свойства объектов, при условии, что не собираетесь их явно использовать. На этом этапе реальные свойства объектов еще не доступны.

Сформировав запрос, необходимо подготовить его к исполнению. Для этого и служит метод Load. Этот метод подготавливает контекст, к чтению всех необходимых объектов, которые используются для получения желаемого результата.

Наконец, для загрузки всех объектов, необходимо выполнить метод ExecuteQueryAsync, который принимает в качестве параметров ссылку на метод, обрабатывающий результат работы запроса (и метод, вызывающийся при сбое).

В отличие от OpenReadAsync, класса WebClient, метод ExecuteQueryAsync инициирует вызов метода, обрабатывающего результаты асинхронного вызова, НЕ в интерфейсном потоке. Поэтому, чтобы обновить интерфейс, необходимо инициировать вызов еще одного метода, но в интерфейсном потоке, предварительно получив и обработав данные. Этим и занимается объект Dispatcher.

Даже на первый взгляд, использование Client API значительно проще, чем работа с REST. Использование клиентских библиотек обладает гибкостью и универсальностью. При этом нужно помнить, что размер Вашего приложения увеличится примерно на 400 килобайт – таков размер дополнительных сборок.

Заключение

Как видно, Microsoft делает на Silverlight достаточно большую ставку. Это позволило привлечь достаточно ресурсов, чтобы позволить Silverlight использоваться не только на новых сайтах, но и в корпоративных Web-приложениях. А раз мы говорим о корпоративном секторе, то стоит вспомнить о возможности работы Silverlight-приложений вне браузера (с повышением полномочий). Эта возможность позволяет не просто устанавливать Silverlight-приложения на сторону клиента, но и обеспечить доступ к кэшу с данными, даже в отключенном режиме, что совсем не реализовано в SharePoint.

Нужно отметить, что в SharePoint 2007 также можно было интегрировать Silverlight-приложения, но для этого нужно было затратить больше усилий. Конечно, ни о каком клиентском API для SharePoint 2007 нельзя было и мечтать.

Written by Sergiy Baydachnyy

12.02.2010 at 15:36

Опубликовано в SharePoint, SilverLight

Tagged with ,

SharePoint 2010 и SilverLight: REST

with one comment

Когда мы рассматривали общий обзор возможностей интеграции Silverlight и SharePoint 2010, то упоминали о поддержке REST. Действительно, если Вы планируете наладить взаимодействие со списком с фиксированной схемой, то можете получить доступные списки на заданном сайте, обратившись к службе по следующему адресу (аналогичному): http://localhost/_vti_bin/ListData.svc/. Получить данные из конкретного списка (например, Media), можно, используя следующую ссылку: http://sbaydach64/_vti_bin/ListData.svc/Media. Если Вы хотите получить конкретный элемент из списка, то ссылка будет выглядеть аналогично этой: http://sbaydach64/_vti_bin/ListData.svc/Media(1). Во всех случаях, данные возвращаются в формате Atom, а, следовательно, базируются на XML.

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

Для начала, реализуем новый интерфейс для Silverlight-приложения:

<UserControl x:Class="SharePointMediaWebPart.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Loaded="UserControl_Loaded">
    <StackPanel x:Name="LayoutRoot" Background="White" 
        Orientation="Horizontal">
        <ListBox Name="myList" SelectionChanged="myList_SelectionChanged">
        </ListBox>
        <MediaElement Name="myMedia" AutoPlay="True"></MediaElement>
    </StackPanel>
</UserControl>

Тут мы изменили главный контейнер, в который добавили ListBox, необходимый для выдачи списка файлов. Кроме того, мы определили два обработчика для событий Load и SelectionChanged. Первый обработчик будет выбирать данные из указанного списка, и заполнять ListBox. Второй обработчик позволит устанавливать новый источник для медиа элемента.

Перейдем к реализации кода.

Внесем изменения в конструктор класса MainPage, добавив код, выбирающий параметр с именем списка из коллекции параметров для встраиваемого компонента (удалите аналогичный код из Application_Startup – в этом примере его там держать не удобно).

private String curList="";
 
public MainPage()
{
    InitializeComponent();
 
    if (App.Current.Host.InitParams.ContainsKey("media"))
    {
       curList = App.Current.Host.InitParams["media"];
    }
}

Реализация обработчика события SelectionChanged также будет простой:

private void myList_SelectionChanged(
   object sender, SelectionChangedEventArgs e)
{
    myMedia.Source = new   
       Uri(String.Format("http://localhost/{0}/{1}",
          curList, myList.SelectedValue.ToString()),
       UriKind.Absolute);
}

(можно было использовать контекст, чтобы выбрать адрес сайта из коллекции)

Тут мы формируем ссылку на файл, лежащий в нашей библиотеке, и устанавливаем источник для MediaElement.

Давайте рассмотрим код последнего обработчика:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    if (curList.Length>0)
    {
        WebClient client = new WebClient();
        client.OpenReadCompleted += 
           new OpenReadCompletedEventHandler(
              client_OpenReadCompleted);
 
        client.OpenReadAsync(
           new Uri(string.Format(
              "http://sbaydach64/_vti_bin/ListData.svc/{0}", 
              curList), 
           UriKind.Absolute));
    }
}

Тут мы устанавливаем асинхронное соединение со службой, используя имя списка, передаваемого в параметрах. Как только данные будут получены, вызовется метод client_OpenReadCompleted, который и будет реализовывать всю работу по обработке XML и заполнению ListBox.

Прежде, чем перейти к написанию кода client_OpenReadCompleted, создайте в SharePoint библиотеку с любым именем (например, Media), и загрузите в нее несколько медиа файлов. После этого, выполните команду, аналогичную этой:

http://localhost/_vti_bin/ListData.svc/Media

Ниже я привожу часть XML, который я получил, выполняя команду выше:

  <entry m:etag="W/&quot;4&quot;">
    <id>http://sbaydach64/_vti_bin/ListData.svc/Media(1)</id>
    <title type="text">Test 1</title>
    <updated>2010-02-10T16:12:06+02:00</updated>
 
. . . . . .
      <d:ContentTypeID>0x0101009110D2200BDC0F429ED6372AF0A68C01</d:ContentTypeID>
      <d:ContentType>Document</d:ContentType>
      <d:Created m:type="Edm.DateTime">2010-02-10T16:10:13</d:Created>
      <d:CreatedByID m:type="Edm.Int32">1073741823</d:CreatedByID>
      <d:Modified m:type="Edm.DateTime">2010-02-10T16:12:06</d:Modified>
      <d:ModifiedByID m:type="Edm.Int32">1073741823</d:ModifiedByID>
      <d:CopySource m:null="true"></d:CopySource>
      <d:ApprovalStatus>0</d:ApprovalStatus>
      <d:Path>/Media</d:Path>
      <d:CheckedOutToID m:type="Edm.Int32" m:null="true"></d:CheckedOutToID>
      <d:Name>Test 1.wmv</d:Name>
      <d:VirusStatus>26246026</d:VirusStatus>
      <d:IsCurrentVersion m:type="Edm.Boolean">true</d:IsCurrentVersion>
      <d:Owshiddenversion m:type="Edm.Int32">4</d:Owshiddenversion>
      <d:Version>1.0</d:Version>
      <d:Title>Test 1</d:Title>
    </m:properties>
  </entry>

Как видно, имя файла содержится в поле d:Name. Поскольку, в данном случае, нам другие данные и не нужны, воспользуемся простым объектом XmlReader, для выбора нужной информации. Вот как будет выглядеть наш код:

        void client_OpenReadCompleted(object sender, 
            OpenReadCompletedEventArgs e)
        {
            XmlReader reader = XmlReader.Create(e.Result);
 
            while (reader.Read())
            {
                if (reader.NodeType==XmlNodeType.Element)
                {
                        if (reader.Name.Contains("Name"))
                        {
                            reader.Read();
 
                            myList.Items.Add(reader.Value);
                            
                        }
                        break;
                }
            }
            myList.SelectedIndex = 0;
        }

Получая XML документ в качестве потока, мы используем XmlReader, для поиска нужного элемента, у которого выбираем значение.

Теперь можно откомпилировать и развернуть данный пример. Указав в качестве параметров Web-части, имя созданного списка с видео, Вы сможете увидеть работу приложения:

image

@10 Результат работы приложения

Если Вы разрабатываете более сложный компонент, то для взаимодействия с XML данными можно использовать один из следующих подходов:

· Используйте прокси классы, созданные Visual Studio – для этого добавьте ссылку на службу с помощью Add Service Reference. Прокси классы будут сгенерированы автоматически. В нашем примере они не очень помогут, так как мы не знаем имя списка;

· Используйте механизмы сериализации (уж не знаю, как это правильно пишется по-русски) – сложно, но эффективно. Зная, что в нашем списке есть определенные поля, мы могли бы не делать привязку к конкретному списку;

· Используйте XLinq – нужно подключать библиотеки из SDK, а в данном случае это не имеет смысла;

· Используйте специальный класс из SDK (SyndicationFeed). Опять же, нужно подключать дополнительную библиотеку. Кроме того, этот класс отказался работать с контентом, возвращаемым SharePoint (хотя должен работать с Atom).

Written by Sergiy Baydachnyy

11.02.2010 at 13:07

Опубликовано в SharePoint, SilverLight

Tagged with ,