Создание бизнес-приложений с помощью Silverlight - Интеграция с бизнес-службами

ОГЛАВЛЕНИЕ

Интеграция с бизнес-службами

Интеграция со службами является одним из важных аспектов бизнес-приложения (LOB), и Silverlight предоставляет много компонентов для доступа к веб- ресурсам и службам. HttpWebRequest, WebClient и инфраструктура прокси Windows Communication Foundation (WCF) являются одними из сетевых компонентов, широко используемых для взаимодействия на основе HTTP. В данной статье интеграция бизнес-процессами на сервере будет осуществляться с помощью службы WCF.

Большинство из нас в ходе разработки приложения используют для интеграции с серверными источниками данных веб-службы; доступ к веб-службам WCF с помощью Silverlight мало отличается от доступа с помощью традиционных приложений, таких как ASP.NET, Windows Presentation Foundation (WPF) или Windows Forms. Разница заключается в поддержке привязки и асинхронной модели программирования. Silverlight будет поддерживать только basicHttpBinding и PollingDuplexHttpBinding. Отмечу, что HttpBinding является привязкой, обеспечивающей оптимальные возможности взаимодействия. По этой причине в данной статье я буду использовать для интеграции именно ее.

PollingDuplexHttpBinding дает возможность использовать контракты обратного вызова для передачи уведомлений по HTTP. В моем центре обработки вызовов эта привязка могла бы использоваться для всплывающих на экране уведомлений. Но для реализации потребуется кэширование подключения HTTP на сервере, что приводит к монополизации одного из двух параллельных подключений HTTP, допускаемых обозревателями, например Internet Explorer 7.0. Это может вызвать снижение производительности, поскольку все веб-содержимое придется сериализовать через одно подключение. Internet Explorer 8.0 допускает шесть подключений на один домен и избавляет от таких проблемы производительности. (Передача уведомлений с помощью PollingDuplexHttpBinding могла бы стать темой будущей статьи, когда Internet Explorer 8.0 получит широкое распространение.)

Вернемся к приложению. Когда агент принимает вызов, процедура вывода данных на экран заполняет экран информацией о вызывающей стороне — в данном случае, сведениями о заказе вызывающей стороны. В сведениях о вызывающей стороне должна присутствовать необходимая информация, позволяющая однозначно идентифицировать заказ в серверной базе данных. В данной демонстрационной ситуации я полагаю, что номер заказа был сообщен системе интерактивного речевого ответа (IVR). Приложение Silverlight будет вызывать веб-службы WCF с использованием номера заказа в качестве уникального идентификатора. Определение контракта службы и реализация показаны на рис. 2.

Рис. 2. Реализация бизнес-службы

ServiceContracts.cs

[ServiceContract]
public interface ICallService
{
  [OperationContract]
  AgentScript GetAgentScript(string orderNumber);
  [OperationContract]
  OrderInfo GetOrderDetails(string orderNumber);
}

[ServiceContract]
public interface IUserProfile  
{
  [OperationContract]
  User GetUser(string userID);
}

CallService.svc.cs

[AspNetCompatibilityRequirements(RequirementsMode = 
  AspNetCompatibilityRequirementsMode.Allowed)]
public class CallService:ICallService, IUserProfile
{
  public AgentScript GetAgentScript(string orderNumber)
  {
  ... 
  script.QuestionList = DataUtility.GetSecurityQuestions(orderNumber);
  return script;
  }

  public OrderInfo GetOrderDetails(string orderNumber)
  {
  ... 
  oi.Customer = DataUtility.GetCustomerByID(oi.Order.CustomerID);
  return oi;
  }

  public User GetUser(string userID)
  {
  return DataUtility.GetUserByID(userID);
  }
}

Web.Config

<system.servicemodel> 
  <services>
  <endpoint binding="basicHttpBinding" contract="AdvBusinessServices.ICallService"/>
  <endpoint binding="basicHttpBinding" contract="AdvBusinessServices.IUserProfile"/>
  </services>  
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<system.servicemodel>

Реализация этих конечных точек службы не представляет большого интереса, поскольку это простые реализации WCF. Для простоты я не буду использовать никакую базу данных для бизнес-объектов, а буду просто использовать находящиеся в памяти объекты List для хранения объектов Customer, Order и User. Класс DataUtil (он здесь не показан, но доступен в загружаемом коде) инкапсулирует доступ к этим находящимся в памяти объектам List.

 

Рис. 3 Сценарий агента с вопросами, касающимися безопасности

Конечным точкам службы WCF для использования Silverlight требуется доступ к конвейеру ASP.NET и, следовательно, требуется атрибут AspNetCompatibilityRequirements реализации CallService. Это соответствие должно быть обеспечено настройкой <serviceHostingEnvironment/> в файле web.config.

Как упоминалось ранее, Silverlight поддерживает только basicHttpBinding и PollingDuplexHttpBinding. Если используется шаблон WCF Service Visual Studio, он настраивает привязку конечной точки к wsHttpBinding, которую необходимо вручную привязкой basicHttpBinding, прежде чем Silverlight сможет добавлять ссылки на службы для генерации прокси. Изменения совместимости размещения ASP.NET и изменения привязок автоматически учитываются, если CallService.svc добавляется к проекту AdvBusinessServices с помощью шаблона WCF Service Visual Studio, поддерживающего Silverlight.